|
Вопрос скорее по Си |
|
|
|
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:52
|

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

|
Цитата(rezident @ Jun 2 2007, 21:24)  Кстати, Сергей, откуда ты взял, что ИАР поддерживает? Из хелпа. Да и тут вопрос задавал, когда в плюсах попробовал использовать и не прошло. Мне тут ответили, что все работает. Переключил в режим С, действительно скомпилилось. А в плюсах - никак. Долго думал. Потом понял, что сама идеология классов (и структур как частных случаев классов) из-за полиформизма такое не допускает. Меня интересовало именно в ОЗУ. Сделал через динамическое выделение байтового массива и накладывание структуры. Кстати (!) структуру описал как open array. Насчет использования incomplete array в разных файлах - тоже наталкивался, но не на ошибку а на варнинг, но сейчас не вспомню какой точно. Если есть интерес - могу попытаться воспроизвести. Если я правильно понял ваш исходник, вы пытались сделать массив из структур, содержащих incomplete array. А поскольку размер такой структуры неизвестен, то и массив из нее сделать никак. P.S. вот читаешь всякие умные книжки, и так у них красиво все получается. Массив нужен из таких структур - пожалуйста: получите массив указателей на такие структуры. И писать можно data = Mystruct[1].data[3]. А вдумаешься - для этой "красоты" на каждую структуру лишний указатель. Выглядит красиво, но в нашей области в бОльшей части реальных задач неприменимо. Или динамическое выделение памяти - с ним задача из примера решается легко и естественно. А оно мне на меге8 с 1К ОЗУ как серпом по... И так практически с каждым примером. Снова порой ощущаю себя как когда с ассемблера на С переползал - "блин, какой тупой компилятор, здесь можно было команду сэкономить, здесь регистр, здесь такт". Может это пройдет, а может в этом есть и положительное - заставляет мозгами активнее шевелить.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
_Артём_ Вопрос скорее по Си 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   zltigo Цитата(rezident @ Jun 2 2007, 21:24) Кста... Jun 2 2007, 19:00    rezident Цитата(zltigo @ Jun 3 2007, 01:00) The ar... Jun 2 2007, 19:16     zltigo ЦитатаЭта цитата означает что...
Да.
Цитата(rezide... Jun 2 2007, 19:27    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
|
|
|