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

 
 
> Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR
west329_
сообщение Feb 20 2009, 09:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Есть некий протокол который пытаюсь описать структурой типа

Код
typedef struct TMainS
  {
    unsigned char   Start;
    unsigned long   Adata;
    unsigned int      Bdata;
    unsigned char   Cdata[var];
    unsigned int      Ddata;
    unsigned int      Edata;

  } T_MainS_Header;


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

Перед присваиваем типов можно легко найти значение var.
Интересует доступ к полям Ddata и Edata, после присваивания типа MainS->Ddata или MainS->Edata.

Возможно ли такое решение, в книге по С такого ненашол, компилятор упорно ругается на Cdata, говорит что надо константа для var, и я с ним согласен, но есть ли другие решения ?

Сообщение отредактировал west329_ - Feb 20 2009, 09:57
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Feb 22 2009, 07:26
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
в том-же реалмоде x86


Ну да. Правда, самый мелкий указатель (в пределах сегмента) все-же соответствовал int'у. Но вообще, про платформы с сегментацией надо забывать, как о страшном сне smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 22 2009, 08:32
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Да и на x51 была возможность косвенной адресации через восьмибитные регистры. Разговор не о "возможных" вариантах адресации на той или иной платформе. Разговор о языке программирования СИ и о том какова в нём разрядность указателя. Я запомнил, что aesok говорил о том, что она по стандарту равна разрядности типа int - я ретранслировал. Надо глянуть в стандарт.
Цитата
5 An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation.
(The mapping functions for converting a pointer to an integer or an integer to a pointer
are intended to be consistent with the addressing structure of the execution environment.)

6 Any pointer type may be converted to an integer type. Except as previously specified, the
result is implementation-defined. If the result cannot be represented in the integer type,
the behavior is undefined. The result need not be in the range of values of any integer
type.
Вот так. преобразование INT<->PTR должно обеспечиваться с легкостью необычайной (на момент принятия стандарта 1999г)smile.gif
Цитата
A pointer to void shall have the same representation and alignment requirements as a
pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of
compatible types shall have the same representation and alignment requirements. All
pointers to structure types shall have the same representation and alignment requirements
as each other. All pointers to union types shall have the same representation and
alignment requirements as each other. Pointers to other types need not have the same
representation or alignment requirements.
Интересно какие остальные?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2009, 20:51
Сообщение #4


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

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



Цитата(demiurg_spb @ Feb 22 2009, 10:32) *
Вот так. преобразование INT<->PTR должно обеспечиваться с легкостью необычайной (на момент принятия стандарта 1999г)smile.gif
Ну. Всё правильно.
Просто "int" не тождественно "integer type" ("Платон человек, но не все люди Платоны").
Даже в процитированном Вами написано
Цитата
The result need not be in the range of values of any integer type.
Смотрим тот же стандарт 99-го года.
Цитата
6.2.5 Types
...
4 There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int. (These and other types may be designated in several additional ways, as described in 6.7.2.) There may also be implementation-defined extended signed integer types.28) The standard and extended signed integer types are collectively called signed integer types.29)

long long int есть integer-type и в него 64-битный указатель влезет и назад вылезет.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 22 2009, 21:22
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Feb 22 2009, 23:51) *
Просто "int" не тождественно "integer type" ("Платон человек, но не все люди Платоны").
Согласен. Я тоже об этом задумывался.
Цитата
long long int есть integer-type и в него 64-битный указатель влезет и назад вылезет.
Это я понял. НО вопрос был задан примерно так "какого размера указатель мне выбрать для адресации массива длиной 333?". И что Вы ответите человеку? Как ему выбрать указатель подходящей размерности?smile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2009, 21:39
Сообщение #6


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

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



Цитата(demiurg_spb @ Feb 22 2009, 23:22) *
Это всё понятно. Вот вопрос был задан примерно так "какого размера указатель мне выбрать для адресации массива длиной 333?". И что Вы ответите человеку? Как ему выбрать указатель подходящей размерности?smile.gif
Не понял вопроса.
T*
где T - тип элемента массива.

Если речь идёт о выборе типа достаточной разрядности для индекса массива, то size_t хватит гарантированно всегда, если минимально-возможной разрядности, то для 333 - int16_t/uint16_t (второе в зависимости от процессора может быть выгоднее по генерируемому коду, хуже врядли будет). В общем случае - пробежаться #if-ами по константам из limits.h и соорудить нужный typedef.

Если вопрос звучит "какой не-указательный тип выбрать для хранения этого указателя?", то сначала я спрошу "а какого его не хранить в переменной типа T* или в крайнем случае void*?"
Если "действительно надо", то вариантом ответа может быть аналогичный предыдущему, только сравнивать по очереди не размер массива с UCHAR_MAX/UINT_MAX, а sizeof(T*) с sizeof() целых типов.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 23 2009, 08:19
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Feb 23 2009, 00:39) *
Не понял вопроса.
Вот и я не понял вопроса. Поэтому и углубился в "теорию си указателей"B) )
Цитата(west329_ @ Feb 23 2009, 09:39) *
Код
- LIMITS.H - .....
- вот этого всего писать не надо было. Разговор не о том и не между первоклассниками. krapula.gif
Цитата
Выходит, что unsigned chort....
unsigned Чёрт побериsmile.gif
Пора закрывать тему. Уже один флэйм идёт.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 23 2009, 11:36
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(demiurg_spb @ Feb 23 2009, 11:19) *
Вот и я не понял вопроса. Поэтому и углубился в "теорию си указателей"B) )
- вот этого всего писать не надо было. Разговор не о том и не между первоклассниками. krapula.gif
unsigned Чёрт побериsmile.gif
Пора закрывать тему. Уже один флэйм идёт.

а указатель может быть signed, обьясните мне ?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 23 2009, 11:48
Сообщение #9


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(west329_ @ Feb 23 2009, 14:36) *
а указатель может быть signed, обьясните мне ?


А адрес ячейки памяти бывает отрицательный?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 23 2009, 20:34
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sergeeff @ Feb 23 2009, 14:48) *
А адрес ячейки памяти бывает отрицательный?
Относительно чего либо бывает. Вы когда-либо видели код типа:
Код
    char* p = (char*)123;
    p[0] = '/0';
    p[-1] = 'а';
    p[-2] = 'п';
    p[-3] = 'о';
    p[-4] = 'Ж';
Я не говорю, что так надо писать, я говорю что так можно и это технически грамотно.
Индексы массива тоже являются "одним из способов адресации". ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- west329_   Можно ли в typedef struct описать массив переменной длины   Feb 20 2009, 09:52
- - ARV   Cdata делайте указателем, не забывая выделять памя...   Feb 20 2009, 09:58
- - sergeeff   Цитата(west329_ @ Feb 20 2009, 13:52) Под...   Feb 20 2009, 10:04
- - Сергей Борщ   Цитата(west329_ @ Feb 20 2009, 11:52) Под...   Feb 20 2009, 11:01
|- - rezident   Цитата(Сергей Борщ @ Feb 20 2009, 16:01) ...   Feb 20 2009, 14:06
|- - Сергей Борщ   Цитата(rezident @ Feb 20 2009, 16:06) а в...   Feb 20 2009, 19:12
- - west329_   Благодар за подсказку. Понятно как действовать дал...   Feb 20 2009, 11:54
- - Rst7   Чисто с прагматической точки зрения я бы положил в...   Feb 20 2009, 19:32
- - west329_   Если забирать данные с Cdata через указатель, како...   Feb 21 2009, 08:25
|- - demiurg_spb   Цитата(west329_ @ Feb 21 2009, 11:25) Есл...   Feb 21 2009, 10:01
|- - sergeeff   Цитата(west329_ @ Feb 21 2009, 12:25) Есл...   Feb 21 2009, 16:59
|- - demiurg_spb   Цитата(sergeeff @ Feb 21 2009, 19:59) Ука...   Feb 21 2009, 17:35
- - Rst7   ЦитатаПо стандарту на язык СИ "размерность...   Feb 21 2009, 17:57
|- - zltigo   Цитата(Rst7 @ Feb 21 2009, 20:57) До появ...   Feb 22 2009, 06:52
|- - sergeeff   Цитата(Rst7 @ Feb 21 2009, 21:57) Да, так...   Feb 22 2009, 11:55
|- - Сергей Борщ   Цитата(west329_ @ Feb 23 2009, 13:36) а у...   Feb 23 2009, 12:01
- - Rst7   ЦитатаРазность между двумя указателями - ptrdiff_t...   Feb 22 2009, 12:04
- - west329_   CODE/* - LIMITS.H - Integral ANSI elemen...   Feb 23 2009, 06:39
- - west329_   Незнал, чесно признаюсь думал, что это описывается...   Feb 23 2009, 12:21
|- - sergeeff   Цитата(west329_ @ Feb 23 2009, 15:21) Нез...   Feb 23 2009, 12:33
- - west329_   ..Указатель — это переменная, значением кото...   Feb 23 2009, 13:40
|- - sergeeff   Цитата(west329_ @ Feb 23 2009, 16:40) ..У...   Feb 23 2009, 15:05
- - sergeeff   Очень жаль, если у вас до сих пор нет понимания ра...   Feb 24 2009, 07:33
|- - demiurg_spb   Цитата(sergeeff @ Feb 24 2009, 10:33) Оче...   Feb 24 2009, 07:42
- - sergeeff   Типун вам на язык и долгих лет жизни. В двоичной...   Feb 24 2009, 09:21
|- - demiurg_spb   Цитата(sergeeff @ Feb 24 2009, 12:21) Тип...   Feb 24 2009, 09:38
- - sergeeff   Цитатаэто уже надо задуматься Задумываться - поле...   Feb 24 2009, 09:53
- - west329_   Подскажите как правильно поступить, хочу использов...   Feb 24 2009, 10:04
|- - demiurg_spb   Цитата(west329_ @ Feb 24 2009, 13:04) Обь...   Feb 24 2009, 10:38
- - west329_   В чем тогда отличие unsigned char от char сори, п...   Feb 24 2009, 10:48
|- - MrYuran   Цитата(west329_ @ Feb 24 2009, 13:48) В ч...   Feb 24 2009, 10:55
|- - demiurg_spb   Цитата(west329_ @ Feb 24 2009, 13:48) ......   Feb 24 2009, 11:09
|- - zltigo   Цитата(west329_ @ Feb 24 2009, 13:48) а т...   Feb 24 2009, 11:12
||- - demiurg_spb   Цитата(zltigo @ Feb 24 2009, 14:12) Ну и ...   Feb 24 2009, 11:24
|||- - zltigo   Цитата(demiurg_spb @ Feb 24 2009, 14:24) ...   Feb 24 2009, 12:08
|||- - demiurg_spb   Цитата(zltigo @ Feb 24 2009, 15:08) Вроде...   Feb 24 2009, 12:34
|||- - gotty   Цитата(demiurg_spb @ Feb 24 2009, 14:34) ...   Feb 24 2009, 12:50
|||- - zltigo   Цитата(gotty @ Feb 24 2009, 15:50) Тут от...   Feb 24 2009, 13:20
|||- - demiurg_spb   Цитата(gotty @ Feb 24 2009, 15:50) Тут от...   Feb 24 2009, 13:38
||- - Сергей Борщ   Цитата(zltigo @ Feb 24 2009, 13:12) Ну и ...   Feb 24 2009, 12:24
|- - xemul   Цитата(west329_ @ Feb 24 2009, 13:48) Код...   Feb 24 2009, 11:21
- - west329_   Код__flash char *test_ = "hello"; __fla...   Feb 24 2009, 11:38
|- - gotty   Цитата(west329_ @ Feb 24 2009, 13:38) Код...   Feb 24 2009, 11:41
|- - demiurg_spb   Цитата(west329_ @ Feb 24 2009, 14:38) [co...   Feb 24 2009, 11:42
|- - gotty   Цитата(demiurg_spb @ Feb 24 2009, 13:42) ...   Feb 24 2009, 11:47
|- - demiurg_spb   Я через минуту раздумий удалил этот пример. Вы опе...   Feb 24 2009, 11:49
- - west329_   Цель сделать поиск в буфере строки которая сидит в...   Feb 24 2009, 12:05
|- - demiurg_spb   Цитата(west329_ @ Feb 24 2009, 15:05) Цел...   Feb 24 2009, 12:07
- - west329_   Код__flash char test_[] = "hello...   Feb 24 2009, 14:14
|- - demiurg_spb   Цитата(west329_ @ Feb 24 2009, 17:14) Это...   Feb 24 2009, 14:22
- - west329_   Код__x_z int strcatstrncmpstrncmp(const void *...   Feb 25 2009, 06:12
|- - demiurg_spb   Цитата(west329_ @ Feb 25 2009, 09:12) Ана...   Feb 25 2009, 08:05
- - west329_   Всё работает как надо, благодарю за помощь. За рад...   Feb 25 2009, 10:20
|- - gotty   Цитата(west329_ @ Feb 25 2009, 12:20) Код...   Feb 25 2009, 10:53
|- - demiurg_spb   Цитата(west329_ @ Feb 25 2009, 13:20) Всё...   Feb 25 2009, 11:06
- - A. Fig Lee   то, что возвращает malloc() правильные пацаны пров...   Feb 26 2009, 02:10


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

 


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


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