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

 
 
> Вопрос скорее по Си
_Артём_
сообщение Jun 1 2007, 15:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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 имела размер не больше чем требуется?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jun 1 2007, 15:48
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Как вариант - использовать "open array" и динамическое выделение памяти:

Код
typedef struct tagMY_STRUCT
{
    U8 size;
    U8 payload[1];
} TMY_STRUCT, *PMY_STRUCT;


{
   PMY_STRUCT pStruct;

   pStruct = (PMY_STRUCT)malloc(...); // столько памяти сколько надо..
   pStruct->size = ...;
..
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 1 2007, 18:20
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 2 2007, 18:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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А.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 2 2007, 19:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Артём_   Вопрос скорее по Си   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


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:51
Рейтинг@Mail.ru


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