|
Вопрос скорее по Си |
|
|
|
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, 15:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
ИМХО, забейте на эту структуру!  Объявите одномерный массив Код unsigned char Data[MAX_DATA_SIZE+1]; И интерпретируйте его первый элемент (Data[0]) как валидный размер текущего массива. Соответственно ваши данные располагайте, начиная со второго элемента массива (Data[1]). P.S. я понимаю, когда в структуру объединяют разнотипные данные, но зачем для однотипных структуру-то создавать? Если только для того чтобы "красиво" в тексте исходника выглядело, дык дефайны для этого имеются, типа Код #define DataSize Data[0]
|
|
|
|
|
Jun 1 2007, 17:17
|

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

|
Цитата(rezident @ Jun 1 2007, 18:28)  ИМХО, забейте на эту структуру!  Совершенно неразумный совет. Цитата И интерпретируйте его первый элемент (Data[0]) как валидный размер текущего массива. Ну зачем, о Господи! Если совершенно естественно именуется поле структуры а уж его "интерпретацией" должен заниматься компилятор. Зачем забивать себе и другим лишними знаниями, соглашениями и потенциальными ошибками. Цитата(_Артём_ @ Jun 1 2007, 19:49)  Пожалуй остановлюсь на массиве. И, простите, как, это поможет проблеме??? Внимательно читайте пост defunct - Ваш вариант это динамическое выделение памяти.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 1 2007, 18:43
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

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

кекс
     
Группа: Свой
Сообщений: 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)  Вот только с выделением облом - автор хотел эти структуры во флеше хранить. Во флеш можно хранить в удобном и нормальном для этого виде, также как у автора ветки - структуры фиксированной длинны. Экономия на мой взгляд может потребоваться во второй части задачи - "загружаться в ОЗУ соответственно ситуации." Вот тут как раз сэкономить поможет способ с дин. выделением памяти.
|
|
|
|
|
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, 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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|