|
|
  |
Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR |
|
|
|
Feb 24 2009, 11:41
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(west329_ @ Feb 24 2009, 13:38)  Код __flash char *test_ = "hello"; __flash char *test_1 = "test1 hello test2";
void test (void) { char *p1, *p2, *p3;
p3 = strstr( test_1, test_); } если так писать то у меня происходит дублирование данных, в SRAM и FLASH Откуда дублирование? Во FLASH строки, а в SRAMе - указатели, правда не для всех платформ
|
|
|
|
|
Feb 24 2009, 11:42
|

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

|
Цитата(west329_ @ Feb 24 2009, 14:38)  [code]__flash char *test_ = "hello"; __flash char *test_1 = "test1 hello test2"; Надо: char __flash test2[] = "test1 hello test2"; И ещё. Задумайтесь: функция strstr знает что Вы решили использовать flash для хранения строк вместо ОЗУ? Или IAR (или что Вы там используете) шибко умный. В GCC надо другую (заточенную flash строки) функцию вызывать.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 12:05
|

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

|
Цель сделать поиск в буфере строки которая сидит во флеш памяти. Хочется использовать готовую процедуру. Пиблизительно похожее на это : Код __flash char *test_ = "hello"; char test_1[350] = "test1 hello test2";
void test (void) { char *p3;
p3 = strstr( test_1, test_); } Это реально сделать с помощью strstr? или надо свою процедуру писать, чтоб понимала строку с озу и с пзу ?
Сообщение отредактировал west329_ - Feb 24 2009, 12:07
|
|
|
|
|
Feb 24 2009, 12:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Feb 24 2009, 13:12)  Ну и моему взгдляду приятнее Код char *test1 = "hello"; char *test2 = "test1 hello test2"; нежели [] Приятнее - возможно. Но есть маленькая разница: sizeof(test1) даст в случае [] размер памяти, выделенной под строку, а в случае * - размер указателя.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 24 2009, 12:34
|

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

|
Цитата(zltigo @ Feb 24 2009, 15:08)  Вроде! Вы просили создавать переменую с указателем? Нет? Так от какой сырости "создаются". Зачем фантазировать? Конечно просил. Ведь код char* name = "Вася"; означает создать переменную типа char* с именем name и проинициализировать ее. Где я ошибаюсь? Об этом я даже в мануале на avr-gcc читал. Я не поленился и прогнал такой тест в gcc 4.3.2 и получил разницу в объёме использования ОЗУ на 2 байта в пользу [] естественно. Зато флеши больше съело на 8 байт с какого-то перепугу - этого я не понял  Код char* name = "Вася"; //char name[] = "Вася"; volatile int i;
int main(void) { i = strlen(name); return (0); }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 24 2009, 12:50
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(demiurg_spb @ Feb 24 2009, 14:34)  Я не поленился и прогнал такой тест в gcc 4.3.2 и получил разницу не в пользу char*. Тут отличия гораздо глубже. Код char name[] = "Вася"; - создать массив длинны 5 байт и инициализировать его значением. Код char *name = "Вася"; - создать указатель на const char, то есть правильнее было бы Код const char *name = "Вася"; , причём при использовании не забываем что даже если объявим без const - "Вася" останется константным. Прошу обратить внимание что это два объявления не эквивалентны что бы их сравнивать на лучше/хуже без учёта конкретного применения.
|
|
|
|
|
Feb 24 2009, 13:20
|

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

|
Цитата(gotty @ Feb 24 2009, 15:50)  Тут отличия гораздо глубже. Разумеется. Речь идет о более-менее частном случае. Цитата то есть правильнее было бы Код const char *name = "Вася"; , Вообще для полного целеуказания: Код char const * const name = "Вася"; Ну или соответственно специализированные квалификаторы для гарвардообразных
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 24 2009, 14:14
|

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

|
Код __flash char test_[] = "hello"; char test_1[] = "test1 hello test2";
void test (void) { char *p1, *p2, *p3;
p1 = (char*)& test_[0]; p2 = & test_1[0]; p3 = strstr( p2, p1); } Это бред ?
|
|
|
|
|
Feb 25 2009, 06:12
|

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

|
Код __x_z int strcatstrncmpstrncmp(const void *, PGM_VOID_P, size_t); __x_z void *memcpy_P(void *, PGM_VOID_P, size_t); __x_z char *strcat_P(char *, PGM_P); __x_z int strcmp_P(const char *, PGM_P); __x_z char *strcpy_P(char *, PGM_P); __x_z char *strncat_P(char *, PGM_P, size_t); __x_z int strncmp_P(const char *, PGM_P, size_t); __x_z char *strncpy_P(char *, PGM_P, size_t) Аналогично функции strstr, ненашол. Копилятор IAR AVR CLIB
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|