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

 
 
> Вопрос скорее по Си
_Артём_
сообщение 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
Ответов
rezident
сообщение Jun 1 2007, 15:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



ИМХО, забейте на эту структуру! wink.gif Объявите одномерный массив
Код
unsigned char Data[MAX_DATA_SIZE+1];

И интерпретируйте его первый элемент (Data[0]) как валидный размер текущего массива. Соответственно ваши данные располагайте, начиная со второго элемента массива (Data[1]).
P.S. я понимаю, когда в структуру объединяют разнотипные данные, но зачем для однотипных структуру-то создавать? Если только для того чтобы "красиво" в тексте исходника выглядело, дык дефайны для этого имеются, типа
Код
#define DataSize Data[0]
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 1 2007, 17:17
Сообщение #3


Гуру
******

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



Цитата(rezident @ Jun 1 2007, 18:28) *
ИМХО, забейте на эту структуру! wink.gif

Совершенно неразумный совет.
Цитата
И интерпретируйте его первый элемент (Data[0]) как валидный размер текущего массива.

Ну зачем, о Господи! Если совершенно естественно именуется поле структуры а уж его "интерпретацией" должен заниматься компилятор. Зачем забивать себе и другим лишними знаниями, соглашениями и потенциальными ошибками.

Цитата(_Артём_ @ Jun 1 2007, 19:49) *
Пожалуй остановлюсь на массиве.

И, простите, как, это поможет проблеме???
Внимательно читайте пост defunct - Ваш вариант это динамическое выделение памяти.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 1 2007, 18:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Jun 1 2007, 23:17) *
Совершенно неразумный совет.

Вы как всегда категоричны smile.gif Чем же он неразумен в применении к структуре однотипных переменных? Структура это всего лишь абстракция, предназначенная для удобства человека. Чтобы человек-программист мог на привычном для него объектном уровне изложить компилятору свою точку зрения на вид, размерность и порядок расположения переменных. Данные в памяти будут все равно в виде байтов, 16-ти или 32-разрядных слов располагаться, в соответствии со способом организации типа памяти конкретного МК.
Цитата(zltigo @ Jun 1 2007, 23:17) *
Ну зачем, о Господи! Если совершенно естественно именуется поле структуры а уж его "интерпретацией" должен заниматься компилятор.

Собственно я об этом же, только без обращения к Творцу smile.gif Только зачем она в приведенном автором топика примере?
Цитата(zltigo @ Jun 1 2007, 23:17) *
Зачем забивать себе и другим лишними знаниями, соглашениями и потенциальными ошибками.

Тогда нужно на Паскале писать, а не на Си. Делов-то!
Цитата(zltigo @ Jun 1 2007, 23:17) *
Внимательно читайте пост defunct - Ваш вариант это динамическое выделение памяти.

Читайте пост Сергея Борщ о том, какие проблемы бывают с незавершенными массивами.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 1 2007, 21:24
Сообщение #5


кекс
******

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



Цитата(rezident @ Jun 1 2007, 21:43) *
Читайте пост Сергея Борщ о том, какие проблемы бывают с незавершенными массивами.

Вам бы тоже не помешало прочитать его пост и сравнить два термина "open array" и "incomplete array".
Проблемы перечисленные Сергеем не распространяются на open array, кроме одной -
Цитата
1)такой массив может располагаться только в конце структуры


Ну а то что нельзя разместить во флеш - да.. Но в контексте AVR - флеша ведь в разы больше чем RAM'а, для чего могла потребоваться такая экономия?!

Цитата(Сергей Борщ @ Jun 1 2007, 21:20) *
Вот только с выделением облом - автор хотел эти структуры во флеше хранить.


Во флеш можно хранить в удобном и нормальном для этого виде, также как у автора ветки - структуры фиксированной длинны. Экономия на мой взгляд может потребоваться во второй части задачи -
"загружаться в ОЗУ соответственно ситуации."
Вот тут как раз сэкономить поможет способ с дин. выделением памяти.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 2 2007, 08:43
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 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
ReAl
сообщение Jun 2 2007, 13:52
Сообщение #8


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

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

Сообщений в этой теме
- _Артём_   Вопрос скорее по Си   Jun 1 2007, 15:17
|- - _Артём_   Цитата(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, 21:43) Стру...   Jun 1 2007, 19:00
|- - 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
- - defunct   Как вариант - использовать "open array" ...   Jun 1 2007, 15:48
|- - Сергей Борщ   Цитата(defunct @ Jun 1 2007, 18:48) Как в...   Jun 1 2007, 18:20
|- - rezident   Цитата(Сергей Борщ @ Jun 2 2007, 00:20) 3...   Jun 2 2007, 18:24
|- - 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
|- - Сергей Борщ   Цитата(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 - 15:07
Рейтинг@Mail.ru


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