|
Раздельная инициализация константного массива |
|
|
|
Aug 8 2012, 15:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(prottoss @ Aug 8 2012, 17:53)  Так, действительно ничо... А так: Код #define OOPS_1 0 #define OOPS_2 1 #define OOPS_3 2 #define OOPS_4 3
#define STATE_OFF 0 #define STATE_SLEEP 1 #define STATE_RUN 2
__flash char DoorSw[1]; __flash char DriverSw[1]; __flash char HoodSw[1]; __flash char TrunkSw[1];
__root __flash const char __flash *oops[] = { [OOPS_1]=DoorSw, [OOPS_2]=DriverSw, [OOPS_3]=HoodSw, [OOPS_4]=TrunkSw
};
char state[] = { [OOPS_1]=STATE_OFF, [OOPS_2]=STATE_RUN, [OOPS_3]=STATE_RUN, [OOPS_4]=STATE_SLEEP };
//....
RunTask (OOPS_2); // запуск задачи (который на самом деле только меняет один элемент в массиве state[]) ?
|
|
|
|
|
Aug 8 2012, 18:30
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(ArtemKAD @ Aug 8 2012, 17:15)  В флеше константный массив указателей на константные строки в флеше. В таком случае для const по стандарту C должно бы быть Код const TYPE * const ARRAY[]; По логике __flash должен быть рядом с const Цитата(prottoss @ Aug 8 2012, 18:36)  Просто замечательно, только через полгода выстрел в голову. Чтобы не настолько в голову, можно как-то так Код // task_list.h TASK(OOPS_1, DoorSw, STATE_OFF) TASK(OOPS_4, TrunkSw, STATE_SLEEP) TASK(OOPS_2, DriverSw, STATE_RUN) TASK(OOPS_3, HoodSw, STATE_RUN) Код // task_tables.c
#define TASK(number, var, state) [number] = var , __flash const char * __flash const oops[] = { #include "task_list.h" }; #undef TASK
#define TASK(number, var, state) [number] = state , char state[] = { #include "task_list.h" }; #undef TASK
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 10 2012, 06:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
ЗЫ. Кстати, для обламывания головы можно добавить такой кусок Код #define TASK(number, fun, state) const char ht_##fun = number; #include "task_list.h" #undef TASK Который позволяет не объявлять заранее дескрипторы задач OOPS_1,OOPS_2,OOPS_3,..., а сделать его из имени функции добавив перед ним ht_ . Т.е. после такого: Код // task_list.h TASK(1, DoorSw, STATE_OFF) TASK(4, TrunkSw, STATE_SLEEP) TASK(2, DriverSw, STATE_RUN) TASK(3, HoodSw, STATE_RUN) появятся константы ht_DoorSw, ht_TrunkSw, ht_DriverSw, ht_HoodSw со значениями равными соответствующим индексам в массивах ...
|
|
|
|
|
Aug 10 2012, 17:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(SSerge @ Aug 8 2012, 18:52)  Конкретные ячейки инициализировать можно таким способом Код __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное. Применение? Часто бывает нужно например иметь массив структур-описателей каких-то объектов и иметь возможность в каких-то случаях работать со всем этим массивом (в цикле к примеру) или работать с отдельными элементами (но проименованными через enum). Приходилось писать что типа: struct {...} static const m[] = {{...}, {...}, {...}, {...}, {...}}; enum {OBJ_A, OBJ_B, OBJ_C, OBJ_D, OBJ_E}; Причём - enum бывает нужно в хидере расположить, а массив - в cpp. Получается что видимой явной связи между m[] и enum нет и в дальнейшем при добавлении/удалении элементов m[] можно легко забыть отредактировать enum, да и отсчитывать номер элемента тож неудобно. Так что - спасибо за инфу, возьму на заметку.
|
|
|
|
|
Aug 10 2012, 20:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(jcxz @ Aug 11 2012, 00:01)  Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное. Ну, дык, стандарт С99, раздел 6.7.8 Initialization. а это один из примеров из этого раздела: struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; update Кстати о enum. Для любителей головоломок (и плюсов) тот же пример можно переписать и так: Код struct sss{ enum {one=1, two}; int a[3], b; } w[] = {[0].a = {sss::one}, [1].a[0] = sss::two }; всё в одном флаконе
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 10 2012, 21:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(SSerge @ Aug 10 2012, 23:46)  Ну, дык, стандарт С99, раздел 6.7.8 Initialization. а это один из примеров из этого раздела: struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; всё в одном флаконе  Что-то у меня этот интересный пример не компилируется (GCC C++) Даже такое не хочет: Код unsigned char B[3]={ [0]=2, [1]=10, [2]=47 }; . Про головоломки и не говорю.
|
|
|
|
|
Aug 11 2012, 07:34
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы. Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут.
Чистый С с 1999 года.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 2 2012, 08:16
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Спасибо начитанным людям. Подсказали как в константу-массив юнионов на этапе компиляции положить не первый элемент юниона. Например когда объявляются float и long по одному и тому же адресу поля. А заодно любопытно, такой или похожий синтаксис - индексирование (пропуская имя переменной) сразу с квадратных скобок или точки с именем поля Код struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; ещё где-то встречается? Upd. Цитата(ReAl @ Aug 11 2012, 12:34)  В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы. Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут. Почему такого в С++ нет, с чем-то конфликтует?
Сообщение отредактировал GetSmart - Sep 2 2012, 14:03
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|