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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Вопрос скорее по Си
singlskv
сообщение Jun 1 2007, 22:15
Сообщение #16


дятел
*****

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

и по необходимости переносить в нее из флеш.
Ну или просто, если уж у Вас структуры хранятся в флеш то это наверное константы ?
тогда просто организуйте доступ к ним без копирования в память
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 1 2007, 22:33
Сообщение #17


Гуру
******

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

и по необходимости переносить в нее из флеш.
Ну или просто, если уж у Вас структуры хранятся в флеш то это наверное константы ?
тогда просто организуйте доступ к ним без копирования в память


Проблема в том, что программной памяти жалко (и так не хватает), это обстоятельство и не позволяет "просто забить в памяти кусок максимального объема типа".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 2 2007, 08:43
Сообщение #18


Гуру
******

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


кекс
******

Группа: Свой
Сообщений: 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 подходят как нельзя лучше.

Согласен.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 2 2007, 12:41
Сообщение #20


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 2 2007, 13:52
Сообщение #21


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

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 2 2007, 14:33
Сообщение #22


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Если нужно, то указателем вполне пожно пользоваться практически как read-only массивом
const char array[]="Preved!";
const char * ptr = &array[0];//это тот указатель, который предлагалось положить в структуру

...
char ptmp = ptr;
char x;
...
x = ptmp[5] ; //x = *(ptmp+5); или x = 'd';

Спрашивается, зачем массив, если размер нельзя узнать? Разве указателя недостаточно?


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 2 2007, 16:42
Сообщение #23


кекс
******

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



Цитата(ReAl @ Jun 2 2007, 16:52) *
Т.е. разницы с точки зрения применения - нет.

В контексте вопроса этой ветки разница есть, и очень существенная.
Так как
struct
{
char A[];
}

просто не воспримится многими компиляторами.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 2 2007, 17:44
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Честно говоря я уже в рассуждениях несколько потерял вопрос-первопричину. Пускай автор всётаки уточнит поподробнее что он хочет сделать и для чего. В этом случае будут грамотнее и конкретнее ответы.

Я поступал подобным образом именно для ОЗУ и динамического распределения. А для определения начала структуры создавал специальный указатель. На удивление получилось наглядно и красиво(для меня) и очень удобно при отладке(всё поддержено отладчиком).

Для размещения во флэш я просто использовал сами массивы и массив ссылок (к примеру). Также можно разместить ссылку и в структуре. Зачем создавать открытый массив во флэш мне несколько не понятно, в том случае если всё равно массив создаётся на этапе компиляции. Если же он создаётся на этапе исполнения, тогда всё правильно, но достаточно сложно работать будет.

Я это к чему? Возможно Вам предложат совершенно иной подход.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 2 2007, 18:24
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 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
defunct
сообщение Jun 2 2007, 18:53
Сообщение #26


кекс
******

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



Цитата(ReAl @ Jun 2 2007, 16:52) *
(кстати, в C++ это не гарантируется, если я правильно помню).

в случае структур - гарантируется с атрибутом __packed
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 2 2007, 19:00
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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
rezident
сообщение Jun 2 2007, 19:16
Сообщение #28


Гуру
******

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


Гуру
******

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



Цитата
Эта цитата означает что...

Да.
Цитата(rezident @ Jun 2 2007, 22:16) *
Не получилось. ИАР выдавал ошибку.

Подтверждаю, что использую без всяких проблем.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 2 2007, 19:52
Сообщение #30


Гуру
******

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

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

 


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


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