реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Раздельная инициализация константного массива
_Артём_
сообщение Aug 8 2012, 15:29
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ArtemKAD @ Aug 8 2012, 18:09) *
Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет.

Да, понятно: адрес задачи-функции не меняется, внутри её switch или ещё что.
Я как-то забыл, что многозадачность кооперативная бывает.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 15:30
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 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[])

?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 8 2012, 15:36
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ArtemKAD @ Aug 8 2012, 21:30) *
Так, действительно ничо...
Просто замечательно, только через полгода выстрел в голову. Может это лично для меня. Если Вас устраивает, то похоже что проблема топика решена


--------------------
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 8 2012, 18:30
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 9 2012, 05:55
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
Чтобы не настолько в голову, можно как-то так

beer.gif
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 10 2012, 06:43
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 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 со значениями равными соответствующим индексам в массивах ...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 10 2012, 17:01
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 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, да и отсчитывать номер элемента тож неудобно.
Так что - спасибо за инфу, возьму на заметку. sm.gif
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 10 2012, 20:46
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 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 };

всё в одном флаконе sm.gif


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 10 2012, 21:35
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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 };

всё в одном флаконе sm.gif

Что-то у меня этот интересный пример не компилируется (GCC C++)

Даже такое не хочет:
Код
unsigned char B[3]={
    [0]=2,
    [1]=10,
    [2]=47
};

.
Про головоломки и не говорю.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 11 2012, 07:34
Сообщение #25


Нечётный пользователь.
******

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



В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы.
Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут.

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 11 2012, 12:18
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ Aug 11 2012, 10:34) *
В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы.

А ИАР-овский Си++ такое понимает...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 2 2012, 08:16
Сообщение #27


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 21:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016