![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 0xDEAD |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Добрый день!
В С можно делать так:
Результат:
Это весьма удобно, указатель на массив без лишних переменных. Вопрос: можно ли в С сделать так с int? Что-то вроде:
Спасибо! |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
нельзя
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Именно так написать нельзя, но можно написать эквивалентный код:
|
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Нашел такой документ:
Anonymous Arrays in C Там написано, что в С можно сделать вот так:
Но что-то оно у меня в VS не работает. |
|||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
gcc компилирует, но нужны дополнительные скобки:
Особенно интересно, что можно почситать размер анонимного массива без генерации кода самого массива. Вот сгенерированный ассемблерный код (без кода main):
|
||||
|
|||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Как раз то, что мне нужно, жалко в MSVC такого нету.
Мне нужно сделать массив с информацией, которую в будущем было бы удобно изменить. Наверно придется сделать со всякими array1, array2... |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Но! Только C, не С++ - в VS C это C++ без классов и новые возможности C, не включённые в C++ отсутствуют.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
можно генерировать макросами, вот самое простое, что у меня получилось:
Не очень наглядно - например, для передачи в макрос значений массива приходится использовать макрос C вместо запятой или макрос с переменным числом аргументов, который тоже не все компиляторы поддерживают (последняя VS вроде поддерживает). |
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
VC ругается на пустой элемент, {}, что не очень критично, а так работает.
Щас буду изучать, я сам тоже что-то такое сделать пытался, но не получилось. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
у gcc есть ключ -E - выполнять только препроцессирование, без компиляции. У VS должен быть такой же. Без него разобраться в подобных макросах сложно. Перед запуском с этим ключом лучше закомментировать #include <stdio.h>, чтобы не мешался.
|
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Упростил до такого вида:
Еще у VC есть штука, которая называется __COUNTER__, но у меня не получилось придумать, куда ее сюда всунуть чтоб убрать номера 1, 2, 3, 4 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
__COUNTER__ можно использовать только разбив исходник на отдельные файлы:
Кстати, последняя запятая в инициализации массива не мешается? Понятно, что ошибок компиляции нет, но не увеличивается ли размер массива на 1? |
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
||||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Предложенный мною в предыдущем посте вариант не работает - нужно генерировать ещё extern int array1[];
Но есть другой вариант - вместо массива генерировать switch, удобнее использовать, контроль неправильного индекса в default, вместо __COUNTER__ использую __LINE__, которая есть везде:
Добавлено @ 08:20 Раз VS ругается на {}, нужно добавить ещё макрос
Это сообщение отредактировал(а) math64 - 22.10.2011, 08:21 |
||||
|
|||||
| 0xDEAD |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Спасибо за советы, вот к чему я пришел:
Не так красиво как с точки зрения исходника, так и с точки зрения результата:
6 лишних проверок и еще пару команд. Правда при большом switch-case компилятор наверно создаст таблицу... Но все же лучше чем предыдущие варианты. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |