|
Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR |
|
|
|
Feb 20 2009, 09:52
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Feb 25 2009, 10:20
|

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

|
Всё работает как надо, благодарю за помощь. За ради интереса, собрал несколько аналогичных функций. Код char* strstr_P(const char* s1, flash char* s2) { size_t len; len = strlen_P(s2); char *buf; buf = malloc(len); strncpy_P(buf, s2, len); return strstr(s1, buf); } самый прожорлевый вариант. прибавил сразу ~240kb Код char* strstr_P(const char* s1, flash char* s2) { #define MAX_STR_LEN 30 // äîïóñòèì 30 char buf[MAX_STR_LEN]; char len = strlen_P(s2); strncpy_P(buf, s2, len); // êîïèðóåì flash â buf buf[len] = '\0'; return strstr(s1, buf) } немного меньше, но всёравно порядка 150кб ваш код самый маленьки оказался, порядка 100кб
|
|
|
|
|
Feb 25 2009, 11:06
|

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

|
Цитата(west329_ @ Feb 25 2009, 13:20)  Всё работает как надо, благодарю за помощь. За ради интереса, собрал несколько аналогичных функций. Эксперементировать надо с умом (простите, но гляда на то что Вы пишите у меня сердце кровью обливается). Купите книжку по СИ и перечитайте её несколько раз - эти трудозатраты с лихвой окупятся. Для общего развития: 1. На каждый malloc() должен быть свой free(). 2. strncpy(s1,s2,n) копирует строку s2 в s1, но не более n символов, поэтому нас не интересует длина s2, т.к. любая строка заканчивается '\0', а приёмный буфер (строка s1) имеет максимальную длину не меньше n. И ещё, прикинте сколько машинных циклов добавят вызовы этих процедур: malloc() и free(). Да, можно еще немного оптимизировать: Код char* strstr_P(const char* s1, flash char* s2) { #define MAX_STR_LEN 30 char buf[MAX_STR_LEN]; buf[MAX_STR_LEN - 1] = '\0'; return strstr(s1, strncpy_P(buf, s2, MAX_STR_LEN-1)); }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
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 Rst7 Цитатав том-же реалмоде x86
Ну да. Правда, самый ... Feb 22 2009, 07:26 demiurg_spb Да и на x51 была возможность косвенной адресации ч... Feb 22 2009, 08:32  ReAl Цитата(demiurg_spb @ Feb 22 2009, 10:32) ... Feb 22 2009, 20:51   demiurg_spb Цитата(ReAl @ Feb 22 2009, 23:51) Просто ... Feb 22 2009, 21:22    ReAl Цитата(demiurg_spb @ Feb 22 2009, 23:22) ... Feb 22 2009, 21:39     demiurg_spb Цитата(ReAl @ Feb 23 2009, 00:39) Не поня... Feb 23 2009, 08:19      west329_ Цитата(demiurg_spb @ Feb 23 2009, 11:19) ... Feb 23 2009, 11:36       sergeeff Цитата(west329_ @ Feb 23 2009, 14:36) а у... Feb 23 2009, 11:48        demiurg_spb Цитата(sergeeff @ Feb 23 2009, 14:48) А а... Feb 23 2009, 20:34       Сергей Борщ Цитата(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 gotty Цитата(west329_ @ Feb 25 2009, 12:20) Код... Feb 25 2009, 10:53 A. Fig Lee то, что возвращает malloc() правильные пацаны пров... Feb 26 2009, 02:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|