|
|
  |
Вопрос скорее по Си |
|
|
|
Jun 1 2007, 22:15
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(_Артём_ @ Jun 1 2007, 19:17)  Структуры должны хранится в программной памяти и загружаться в ОЗУ соответственно ситуации. Проблема в том, что Data может быть разной длины (от 1 до 128), то есть программная память зря расходуется. Может быть я конечно не все понял, но в чем вобще проблема ? Копирование из флеш в рам в вашей ситуации все равно придется делать "ручками" Ну дык и кто мешает просто забить в памяти кусок максимального объема типа Код #define MAX_DATA_SIZE 128 struct { unsigned char DataSize;// размер данных unsigned char Data[MAX_DATA_SIZE]; } currStruct; и по необходимости переносить в нее из флеш. Ну или просто, если уж у Вас структуры хранятся в флеш то это наверное константы ? тогда просто организуйте доступ к ним без копирования в память
|
|
|
|
|
Jun 1 2007, 22:33
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(singlskv @ Jun 2 2007, 01:15)  Может быть я конечно не все понял, но в чем вобще проблема ? Копирование из флеш в рам в вашей ситуации все равно придется делать "ручками" Ну дык и кто мешает просто забить в памяти кусок максимального объема типа Код #define MAX_DATA_SIZE 128 struct { unsigned char DataSize;// размер данных unsigned char Data[MAX_DATA_SIZE]; } currStruct; и по необходимости переносить в нее из флеш. Ну или просто, если уж у Вас структуры хранятся в флеш то это наверное константы ? тогда просто организуйте доступ к ним без копирования в память Проблема в том, что программной памяти жалко (и так не хватает), это обстоятельство и не позволяет "просто забить в памяти кусок максимального объема типа".
|
|
|
|
|
Jun 2 2007, 08:43
|

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

|
Цитата(defunct @ Jun 2 2007, 00:24)  сравнить два термина "open array" и "incomplete array". Стоп. Термин "incomplete array" приведен в стандарте С. Термина open array там нет, поэтому я решил что rezident ошибся в термине и поправил его, чтобы интересующийся ответом мог дальше искать информацию по правильным ключевым словам. Ваша фраза наталкивает на мысль, что open array это совершенно иная (хоть и похожая) конструкция. Но ладно стандарт, даже гугля на первых двух страницах не дает ни одной тематической ссылки на запрос "c open array" (дальше не искал). Поэтому объясните, что же такое "open array". Судя по вашей реплике, они есть в С++, с ними дружит sizeof и из них можно делать массивы? Цитата(defunct @ Jun 2 2007, 00:24)  Ну а то что нельзя разместить во флеш - да.. Но в контексте AVR - флеша ведь в разы больше чем RAM'а, для чего могла потребоваться такая экономия?! Как раз для размещения во флеш в этой задаче incomplete arrays подходят как нельзя лучше. А вот при работе в ОЗУ - да, динамическое выделение памяти выглядит красиво, но не в каждой задаче имеет смысл его использовать. Тогда можно по ситуации - или дин. память или присваивать указателю на такую структуру адрес заранее выделенного буфера и дальше работать с буфером как со структурой этого типа.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 2 2007, 12:40
|

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

|
Цитата(Сергей Борщ @ Jun 2 2007, 11:43)  Стоп. Термин "incomplete array" приведен в стандарте С. Термина open array там нет, поэтому я решил что rezident ошибся в термине и поправил его Вы поправляли меня. Под open array, я привел конструкцию: char A[1]; а не char A[] т.е. это обычный массив объявленный с количеством элементов = 1. Но ничто не мешает нам обращаться к элементам A[1], A[2] и т.д., необходимо лишь быть уверенным, что обращаясь к этим элементам мы не затрем ничего лишнего. При дин. выделении памяти - мы определяем границу массива количеством выделенной под него памяти. Цитата , чтобы интересующийся ответом мог дальше искать информацию по правильным ключевым словам. По ключевому слову incomplete он бы нашел не то, что я имел в виду. Цитата Поэтому объясните, что же такое "open array". Судя по вашей реплике, они есть в С++, с ними дружит sizeof и из них можно делать массивы? Отличие выше, с sizeof он конечно же тоже не дружит, т.к. будет возвращена длина 1. Но sizeof не был перечислен в Вашем списке проблем, либо я невнимательно смотрел. В C++ нично не препятствует использованию таких конструкций. Цитата Как раз для размещения во флеш в этой задаче incomplete arrays подходят как нельзя лучше. Согласен.
|
|
|
|
|
Jun 2 2007, 12:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата присваивать указателю на такую структуру адрес заранее выделенного буфера и дальше работать с буфером как со структурой этого типа А что, преобразование типа через void * не годится или имеется в виду то же? Если массивы есть, то кто им мешает располагаться во FLASH? Вроде этого и хотели. Добавить модификаторы const __flash ко всем элементам (кроме typedef), т.е. к массивам и структурам, в вариант http://electronix.ru/forum/index.php?showt...32479&st=0# и свободно пользоваться - массивы нужной длины во FLASH, структуры для работы с ними - тоже, "лишнего" места - аж по одному указателю на 1 массив. Просто не очень понятно, зачем для const массивов создавать что-то динамическое? Если нужно копировать, то всё-равно будет нужно куда-то положить. Если не обязательно, то можно взять по указателю в любое время.
--------------------
aka Vit
|
|
|
|
|
Jun 2 2007, 13:52
|

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

|
Цитата(defunct @ Jun 2 2007, 15:40)  Под open array, я привел конструкцию: char A[1]; а не char A[]; т.е. это обычный массив объявленный с количеством элементов = 1. ... Отличие выше, с sizeof он конечно же тоже не дружит, т.к. будет возвращена длина 1. Но sizeof не был перечислен в Вашем списке проблем, либо я невнимательно смотрел. Не вижу принципиальных отличий. К char A[]с тем же успехом можно обращаться через A[1], A[2] и так далее, "необходимо лишь быть уверенным" и далее по тексту. Точно так же не дружит с sizeof(), только для char A[1] надо ptr = malloc( sizeof(struct header) + data_len - 1); а для char A[] надо ptr = malloc( sizeof(struct header) + data_len); что несколько более логично. Т.е. разницы с точки зрения применения - нет. Фактически, char A[1]; - это старый добрый программистский трюк, основанный на том, что поля структуры расположены в памяти в том же порядке, в котором записаны в структуре (кстати, в C++ это не гарантируется, если я правильно помню). char A[]; - это стандартизованный способ. Кстати, GNU-тое расширение позволяло писать char A[0];
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jun 2 2007, 16:42
|

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

|
Цитата(ReAl @ Jun 2 2007, 16:52)  Т.е. разницы с точки зрения применения - нет. В контексте вопроса этой ветки разница есть, и очень существенная. Так как struct { char A[]; } просто не воспримится многими компиляторами.
|
|
|
|
|
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 2 2007, 19:16
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zltigo @ Jun 3 2007, 01:00)  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. Эта цитата означает что структура не может состоять только из одного incomplete array, я правильно понял? Нет, у меня была структура из разных переменных в конце которой я пытался вставить этот incomplete array. Не получилось. ИАР выдавал ошибку. Кстати, могла ли быть эта ошибка вызвана тем, что объявлял я структуру с одновременной инициализацией ее в одном модуле, а использовал еще и в двух других. Естественно, что в других модулях был описан ее прототип с квалификатором extern.
|
|
|
|
|
Jun 2 2007, 19:27
|

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

|
Цитата Эта цитата означает что... Да. Цитата(rezident @ Jun 2 2007, 22:16)  Не получилось. ИАР выдавал ошибку. Подтверждаю, что использую без всяких проблем.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|