Перейти к содержанию
    

Раздельная инициализация константного массива

Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет.

Да, понятно: адрес задачи-функции не меняется, внутри её switch или ещё что.

Я как-то забыл, что многозадачность кооперативная бывает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....

ИЧО?

Так, действительно ничо...

А так:

 #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[])

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так, действительно ничо...
Просто замечательно, только через полгода выстрел в голову. Может это лично для меня. Если Вас устраивает, то похоже что проблема топика решена

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В флеше константный массив указателей на константные строки в флеше.
В таком случае для const по стандарту C должно бы быть

const TYPE * const ARRAY[];

По логике __flash должен быть рядом с const

 

 

Просто замечательно, только через полгода выстрел в голову.
Чтобы не настолько в голову, можно как-то так

 

// 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЗЫ. Кстати, для обламывания головы можно добавить такой кусок

#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 со значениями равными соответствующим индексам в массивах ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретные ячейки инициализировать можно таким способом

__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, да и отсчитывать номер элемента тож неудобно.

Так что - спасибо за инфу, возьму на заметку. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное.

Ну, дык, стандарт С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 };

всё в одном флаконе :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, дык, стандарт С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
};

.

Про головоломки и не говорю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы.

Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут.

 

Чистый С с 1999 года.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы.

А ИАР-овский Си++ такое понимает...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо начитанным людям. Подсказали как в константу-массив юнионов на этапе компиляции положить не первый элемент юниона. Например когда объявляются float и long по одному и тому же адресу поля.

 

А заодно любопытно, такой или похожий синтаксис - индексирование (пропуская имя переменной) сразу с квадратных скобок или точки с именем поля

struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 };

ещё где-то встречается?

 

Upd.

В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы.

Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут.

Почему такого в С++ нет, с чем-то конфликтует?

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...