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

|
В программе объявлен такой тип данных Код #define MAX_DATA_SIZE 128 struct TStructure { unsigned char DataSize;// размер данных unsigned char Data[MAX_DATA_SIZE]; }; Соответственно есть переменные такого типа: Код struct TStructure st1={ 3, {1,2,3} }; struct TStructure st1={ 1, {1} }; Структуры должны хранится в программной памяти и загружаться в ОЗУ соответственно ситуации. Проблема в том, что Data может быть разной длины (от 1 до 128), то есть программная память зря расходуется. Как определить структуру, чтобы поле Data имела размер не больше чем требуется?
|
|
|
|
|
 |
Ответов
|
Jun 1 2007, 18:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(defunct @ Jun 1 2007, 18:48)  Как вариант - использовать "open array" и динамическое выделение памяти: Вот только с выделением облом - автор хотел эти структуры во флеше хранить. Т.е. если использовать "incomplete arrays" (в терминологии стандарта), то должно получиться: Код typedef struct { uint8_t size; uint8_t data[] } my_struct_type; my_struct_type const __flash Struct = { 2, { 1, 2} }; Только надо помнить четыре вещи: 1)такой массив может располагаться только в конце структуры 2)sizeof() будет выдавать размер такой структуры без учета массива, т.е. в данном случае 1 и сделать массив из таких структур уже не получится, а также арифметика указателей на этих структурах будет работать некорректно. 3) не все компиляторы поддерживают incomplete arrays (ИАР поддерживает) 4) В С++ такое уже не прокатит.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 2 2007, 18:24
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Сергей Борщ @ Jun 2 2007, 00:20)  3) не все компиляторы поддерживают incomplete arrays (ИАР поддерживает) Кстати, Сергей, откуда ты взял, что ИАР поддерживает? Помнится у меня была подобная проблема, когда в зависимости от конкретной прикладной задачи прибора, нужно было хранить в сегменте INFO MSP430 наряду с определенным количеством констант еще произвольное описание масок для данных. Так вот предлагаемый тобой способ с incompete array не прокатил. Хотя я располагал массив как и положено в конце структуры констант. Пришлось определять его отдельно как константный байтовый массив с одновременной инициализацией его. А в самой программе писать свою функцию, разбирающую этот массив на данные нужной размерности. Код //описание масок для обработки буфера данных, сетевых и локальных // кол-во байт описания - смещение для переменной в буфере - маска1[, маска2, маска3, ...]; 0 - завершение описания #pragma pack(1) #pragma location=(0x1000+sizeof(InfoSeg)) const unsigned char MaskLedOut[]= { 0, //описание для LED1 0, //описание для LED2 0, //описание для LED3 0, //описание для LED4 1, MAIN_LOC_BUF_OFF, 0x10, 0, //описание для LED5 1, MAIN_LOC_BUF_OFF, 0x20, 0, //описание для LED6 1, MAIN_LOC_BUF_OFF, 0x40, 0, //описание для LED7 1, MAIN_LOC_BUF_OFF, 0x80, 0, //описание для LED8 1, MAIN_LOC_BUF_OFF+1, 0x01, 0, //описание для LED9 1, MAIN_LOC_BUF_OFF+1, 0x02, 0, //описание для LED10 1, MAIN_LOC_BUF_OFF+1, 0x04, 0, //описание для LED11 1, MAIN_LOC_BUF_OFF+1, 0x08, 0, //описание для LED12 0, //описание для LED13 1, MAIN_NET_BUF_OFF(5)+3, 0x80, 0, //описание для LED14 4, MAIN_NET_BUF_OFF(5), 0x5E, 0x60, 0x00, 0x03, 0,//описание для LED15 1, MAIN_NET_BUF_OFF(6), 0x06, 0 //описание для LED16 }; #pragma pack() Ах да! Пользовался я ИАР ЕВ430 3.30А.
|
|
|
|
|
Jun 2 2007, 19:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(rezident @ Jun 2 2007, 21:24)  Кстати, Сергей, откуда ты взял, что ИАР поддерживает? Поддерживает. Практически используется, ну и родной документ по IAR EW430: Код Incomplete arrays at end of structs The last element of a struct may be an incomplete array. This is useful because one chunk of memory can be allocated for the struct itself and for the array, regardless of the size of the array. Цитата Так вот предлагаемый тобой способ с incompete array не прокатил Невероятно, разве только если не пытались совсем грубо: Код The array may not be the only member of the struct. If that was the case, then the size of the struct would be zero, which is not allowed in ISO/ANSI C.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
_Артём_ Вопрос скорее по Си Jun 1 2007, 15:17 rezident ИМХО, забейте на эту структуру! Объявите одно... Jun 1 2007, 15:28 _Артём_ Цитата(rezident @ Jun 1 2007, 18:28) P.S.... Jun 1 2007, 15:44  rezident Цитата(_Артём_ @ Jun 1 2007, 21:44) Данны... Jun 1 2007, 16:30   _Артём_ Цитата(rezident @ Jun 1 2007, 19:30) Вы с... Jun 1 2007, 16:49 zltigo Цитата(rezident @ Jun 1 2007, 18:28) ИМХО... Jun 1 2007, 17:17  rezident Цитата(zltigo @ Jun 1 2007, 23:17) Соверш... Jun 1 2007, 18:43   zltigo Цитата(rezident @ Jun 1 2007, 21:43) Стру... Jun 1 2007, 19:00   defunct Цитата(rezident @ Jun 1 2007, 21:43) Чита... Jun 1 2007, 21:24    Сергей Борщ Цитата(defunct @ Jun 2 2007, 00:24) сравн... Jun 2 2007, 08:43     defunct Цитата(Сергей Борщ @ Jun 2 2007, 11:43) С... Jun 2 2007, 12:40      ReAl Цитата(defunct @ Jun 2 2007, 15:40) Под o... Jun 2 2007, 13:52       defunct Цитата(ReAl @ Jun 2 2007, 16:52) Т.е. раз... Jun 2 2007, 16:42       defunct Цитата(ReAl @ Jun 2 2007, 16:52) (кстати,... Jun 2 2007, 18:53 _artem_ первый элемент структуры (для всех структур) можно... Jun 1 2007, 15:44    rezident Цитата(zltigo @ Jun 3 2007, 01:00) The ar... Jun 2 2007, 19:16     zltigo ЦитатаЭта цитата означает что...
Да.
Цитата(rezide... Jun 2 2007, 19:27   Сергей Борщ Цитата(rezident @ Jun 2 2007, 21:24) Кста... Jun 2 2007, 19:52    zltigo Цитата(Сергей Борщ @ Jun 2 2007, 22:52) И... Jun 2 2007, 20:11     Сергей Борщ Цитата(zltigo @ Jun 2 2007, 23:11) А каки... Jun 2 2007, 20:37      zltigo Цитата(Сергей Борщ @ Jun 2 2007, 23:37) А... Jun 2 2007, 21:38 sensor_ua IMHO, лучше массивы не пытаться укладывать в струк... Jun 1 2007, 16:23 defunct Цитата(sensor_ua @ Jun 1 2007, 19:23) IMH... Jun 1 2007, 17:14 SasaVitebsk Наверное присоединюсь к defunct и zltigo. И структ... Jun 1 2007, 17:50 singlskv Цитата(_Артём_ @ Jun 1 2007, 19:17) Струк... Jun 1 2007, 22:15 _Артём_ Цитата(singlskv @ Jun 2 2007, 01:15) Може... Jun 1 2007, 22:33  tag Цитата(_Артём_ @ Jun 2 2007, 01:33) Пробл... Jun 4 2007, 08:03   _Артём_ Цитата(tag @ Jun 4 2007, 11:03) ...непоня... Jun 4 2007, 21:14    zltigo Цитата(_Артём_ @ Jun 5 2007, 00:14) Вариа... Jun 4 2007, 21:27     _Артём_ Цитата(zltigo @ Jun 5 2007, 00:27) Ой... Jun 5 2007, 20:20      zltigo Цитата(_Артём_ @ Jun 5 2007, 23:20) Приво... Jun 5 2007, 20:30       _Артём_ Цитата(zltigo @ Jun 5 2007, 23:30) Ну и п... Jun 5 2007, 21:22    Сергей Борщ А про С++ в вопросе не было!
Цитата(_Артём_ ... Jun 5 2007, 08:14     ReAl Цитата(Сергей Борщ @ Jun 5 2007, 10:14) В... Jun 5 2007, 10:17      Oldring Цитата(ReAl @ Jun 5 2007, 14:17) На мой в... Jun 5 2007, 11:06       rezident Цитата(Oldring @ Jun 5 2007, 17:06) Если ... Jun 5 2007, 11:09        Oldring Цитата(rezident @ Jun 5 2007, 15:09) Я эт... Jun 5 2007, 11:44 sensor_ua Цитатаприсваивать указателю на такую структуру адр... Jun 2 2007, 12:41 sensor_ua Если нужно, то указателем вполне пожно пользоватьс... Jun 2 2007, 14:33 SasaVitebsk Честно говоря я уже в рассуждениях несколько потер... Jun 2 2007, 17:44 rezident Цитата(Сергей Борщ)Или динамическое выделение памя... Jun 2 2007, 20:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|