Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Строковые и символьные типы в AVR С
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
beer_warrior
А куда указывает указатель s?

ПС если есть желание получать ответы, желательно быть повежливее.
zheka
На строку s. В строку s копируется в данном случае MainMenu[1].

Хм, сейчас попробовал его убрать в начале функции main, или вообще что-то поменять - не работает без char *s.

А если он никуда не указывает, тогда почему же все работает?
Если указатель, никуда не указывающий здесь лишний - уберите из программы лишнее, но так, чтобы все работало.


P.S. Еще одна причина несчастий - обнаружилось, что если выводить текст на 3 строке LcdGotoXY(1,3), то выводится бред. Это уже недоработки драйвера ЖКИ.


Кстати, объясните мне еще такую вещь:
Вот мануал из Codevision
Цитата
/* Pointer to a char string placed in FLASH */
flash char *ptr_to_flash1=”This string is placed in FLASH”;
char flash *ptr_to_flash2=”This string is also placed in FLASH”;


В чем разница между этими двумя способами?


Цитата
ПС если есть желание получать ответы, желательно быть повежливее


Знаете, без повода я не хамлю. А вот иногда некоторых товарищей хочется просто обматерить, например г-на vet

Посмотрите, как он привел якобы цитату якобы из моего поста якобы на текст примера из CodeVision Examples:

http://electronix.ru/forum/index.php?showtopic=13521&st=45#

А теперь смотрим оригинал

http://electronix.ru/forum/index.php?showtopic=13521&st=30#
vet
zheka
А ругаться не надо. Внимательно прочтите мой пост, и увидите, что цитируется в нём пост №42, а никакой не №30.
Это простая невнимательность или провокация флейма?
beer_warrior
char *s - это не строка, это указатель на строку.Это просто произвольный
адрес по которому складываются результаты sprintf.
Каким-то образом этот адрес оказывается верным при отсутсвии r[]
s надо проинициализирорвать адресом реального буфера
Код
unsigned char r[16];

void main ()
{
int i,j;
char *s = r;

....

sprintf(s,"%p", MainMenu[i]);

...
}


или не использовать вообще


Код
unsigned char r[16];

void main ()
{
int i,j;


....

sprintf(r,"%p", MainMenu[i]);

...
}


Открой отладчик и прогони код - все сразу станет ясно.

Цитата
Знаете, без повода я не хамлю. А вот иногда некоторых товарищей хочется просто обматерить,

А хамить вообще не надо, и по поводу и без.
Просто взять и не хамить. smile.gif
beer_warrior
Вдогонку,
совершенно непонятно зачем нужен sprintf()

1.создаем строки
const unsigned char c[]="asfasfasf";
flash unsigned char f[]="12345";

2.объявляем буфер
char r[16]

3.Копируем обычную строку
strcpy(r,c);

4.Копируем флэш строку
strcpy_P(r,f);

5.Выводим
LcdStr(FONT_1X, r, NORMAL);
или для обычной
LcdStr(FONT_1X, с, NORMAL);
zheka
Цитата
А ругаться не надо. Внимательно прочтите мой пост, и увидите, что цитируется в нём вовсе не №30, а очень даже №42.


Vet!!!

Знаете, я сейчас не ругаюсь я просто смеюсь. :D :D


Вы увидели ссылку а не номер поста! Повторю - ссылку, заканчивающуюся на цифру 30. А если бы вы не искали пост №30, а нажали бы ссылку, то вам открылся бы пост не 30, а "очень даже 42" !!! А хотите еще фокус? Наведите курсор на номер в посте №42 и в строке состояния вы увидите цифру не 42, а очень даже 30!

Это простая невнимательность или провокация флейма?

Теперь по делу. По словом "пример", я подразумевал работу с указателями в eeprom и flash. И именно этот код приведен в посте №42, в функции main и он действительно есть в CodeVision examples. А то, что до функции main - так это вывод на экран, об этом ранее не раз было говорено и писано.


beer_warrior

Хм.. Получилось...
Резюме такое - char *s, никуда не указывающая благополучно работает с функцией sprintf, до тех пор, пока не появляется char r[16]... Каким-то образом, они мешают друг другу. И кстати - проблема со строкой №3 на экране исчезла после того как я добавил "=r".

Пока что, что я только не делаю - все работает. Спасибо!!!
Будем разбираться с EEPROM. Обещаю тщательно почитать мануал, прежде чем идти к вам с новыми вопросами.
zheka
И strcpy тоже работает.

И все же, объясните, в чем разница между
flash char *ptr_to_flash1=”This string is placed in FLASH”;
и
char flash *ptr_to_flash2=”This string is also placed in FLASH”;
?
WHALE
zheka Разницы нету-это две возможные формы в CodeVision помещения строки в данной случае во флеш и инициализации указателя на неё.Извини,но похоже,ты так и не разобрался что такое указа-
тель и с чем его едят.В любой книге по С/C++ это подробно описывается.И еще,я уже спрашивал,поче-
му ты не пользуюешься симулятором.CodeVision генерит coff-файл.Как запустить отладку в студии,есть
в его хелпе.Функции у тебя простые,отладка должна занять минимум времени cranky.gifУйдет масса вопросов.
beer_warrior sprintf имхо,очень полезная функция для формирования буфера вывода в ЖКИ-
формирует строку из абсолютно разных типов данных в нужном формате-очень удобно
sprintf(buf_ind,"P=%02.0u%c MOD=%02.0u%c СИ=%02.0u%c",P_TV[N_TV],'%',MOD[N_TV],'%',CINX[N_TV],'%');
beer_warrior
А вот это же детали конкретного компилятора.
char* x = ""; указыват на строку в ОЗУ.
flash, __flash, PROGMEM это модификатор указывающий что данные во флэше.Как он используеться зависит от компиялятора.Тут чистый случай RTFM.
Замечу что и данные должны помечаться как флэш и указатель тоже должен быть на флэш.

2WHALE
конечно, и я об этом писал, но в приведенном коде он явно излишен.
Константные строки однако.
defunct
Цитата(Petka @ Mar 16 2006, 09:33) *
Цитата(defunct @ Mar 15 2006, 20:06) *

...
2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)


Любопытно, а почему так выгоднее?

Для ускорения поиска требуемой строки. (раз планируется использовать eeprom, то скорее всего предполагается обновление строк, а коль так, то будет меняться и их размер, следовательно потребуется поиск).

Разумеется, сказанное имеет смысл только в том случае если не используется массив индексов (с указателями на начало строк).
Petka
Цитата(defunct @ Mar 16 2006, 21:15) *
Цитата(Petka @ Mar 16 2006, 09:33) *

Цитата(defunct @ Mar 15 2006, 20:06) *

...
2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)


Любопытно, а почему так выгоднее?

Для ускорения поиска требуемой строки. (раз планируется использовать eeprom, то скорее всего предполагается обновление строк, а коль так, то будет меняться и их размер, следовательно потребуется поиск).

Разумеется, сказанное имеет смысл только в том случае если не используется массив индексов (с указателями на начало строк).


Забавно, а я-то думал есть какие-то идеологические различия, может чего не знаю. =) Но всё-таки лучше использовать везде стандартный способ хранения строк, всё-таки переносимее будет. Ладно, это уже Оффтоп.

По поводу топика: всё-таки я удивляюсь, насколько бывают терпеливыми люди, дающие ответы. И насколько бывают упёртыми люди, задающие вопросы, которых легко избежать, прочитав хотя бы основы...

2Zheka: В следующий раз, как будете приводить в топике исходники, приводите их с комментариями на КАЖДОЙ строчке. Я уверен, как только вы попытаетесь прокомментировать КАЖДУЮ строчку, половина вопросов исчезнет сама собой.... Да и ответ давать будет гораздо проще.
defunct
Цитата(Petka @ Mar 17 2006, 09:13) *
Забавно, а я-то думал есть какие-то идеологические различия, может чего не знаю. =) Но всё-таки лучше использовать везде стандартный способ хранения строк, всё-таки переносимее будет.

Дык, на оба предствления строк есть соответствующие стандарты, здесь нет никаких велосипедов! ;>
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.