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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR
msalov
сообщение Feb 24 2009, 11:41
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 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е - указатели, правда не для всех платформ sad.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 11:42
Сообщение #47


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

Группа: Свой
Сообщений: 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 строки) функцию вызывать.


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


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(demiurg_spb @ Feb 24 2009, 13:42) *
char* __flash test2 = "test1 hello test2";

Такая конструкция вообще мало имеет смысла :/ Зачем нужен указатель хранящийся во флеш, который ссылается на строку, которая скорее всего тоже пойдёт во флеш?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 11:49
Сообщение #49


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

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



Я через минуту раздумий удалил этот пример. Вы опередилиsmile.gif
Это ещё раз показывает, что [] лаконичнее.


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


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 12:07
Сообщение #51


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

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



Цитата(west329_ @ Feb 24 2009, 15:05) *
Цель сделать поиск в буфере строки которая сидит во флеш памяти. Хочется использовать готовую процедуру.
тако реально сделать ? или надо свою процедуру писать
Для начала изучите библиотеку прежде чем сыпать вопросами, если не найдёте подходящей функции то тогда и поговорим.


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


Гуру
******

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



Цитата(demiurg_spb @ Feb 24 2009, 14:24) *
Так вроде как создаются ещё и лишние переменные типа указатель на строку, а в случае с [] нет.

Вроде! Вы просили создавать переменую с указателем? Нет? Так от какой сырости "создаются". Зачем фантазировать?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 24 2009, 12:24
Сообщение #53


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 12:34
Сообщение #54


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

Группа: Свой
Сообщений: 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 байт с какого-то перепугу - этого я не понялsad.gif
Код
char* name = "Вася";
//char name[] = "Вася";
volatile int i;

int main(void)
{
    i = strlen(name);
    return (0);
}


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


Знающий
****

Группа: Свой
Сообщений: 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 - "Вася" останется константным.
Прошу обратить внимание что это два объявления не эквивалентны что бы их сравнивать на лучше/хуже без учёта конкретного применения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 24 2009, 13:20
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 13:38
Сообщение #57


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

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



Цитата(gotty @ Feb 24 2009, 15:50) *
Тут отличия гораздо глубже.
Глубже-мельче...
В чистом виде (без static const) разница конкретная: в одном случае созаётся лишь массив, а в другом ещё и указатель на него. Вот и всё. Кому что нужно тот то и выбирает для себя. С константным указателем на константную строку наверняка могут быть варианты - будет зависеть от IQ компилятора.


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


Местный
***

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


Это бред ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 24 2009, 14:22
Сообщение #59


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

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



Цитата(west329_ @ Feb 24 2009, 17:14) *
Это бред ?
Вы на кофейной гуще гадаете что-ли? Документацию читали? Какие функции нашли? В отладчике (можно AVR-Studio) прогоняли? Какой компилятор? Делов на 20 минут. А вы... Ложку дай...
Файлик <pgmspace.h> смотрели - там все функции для работы с falsh.


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


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:12
Рейтинг@Mail.ru


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