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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Строковые и символьные типы в AVR С
vet
сообщение Mar 15 2006, 18:03
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(zheka @ Mar 15 2006, 19:47) *
Ладно, господа профессионалы, высочайшего класса.

Вот вам пример, взятый из CodeVision Examples,т.е. 100% рабочий,
т.е. все ошибки человека не отягощенного профессионализмом исключены, все указатели все переменные инициализированы.

Даже если где и закралась ошибка, опечатка и пр - компилятор бы ругался. Вот пример

Код
void LcdStr ( LcdFontSize size, byte *dataPtr, LcdPixelInverse inverse )
{

    while (*dataPtr)
    {
        LcdChr( size, *dataPtr, inverse );
    }
}



Ваше мнение?


Что-то не видел я в Examples такого примера. Да и не могло его там быть, в приведённой функции бросается в глаза ошибка - не увеличивается указатель dataPtr.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 15 2006, 19:23
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Действительно,твой пример работать не будет-явная ошибка в коде.Сейчас посмотрел,нет в кодвижине поддержки графических ЖКИ,тем более от НОКИИ,только алфавитно-цифровые ohmy.gif Выводить из ЕЕпрома можешь,только написав отдельную функцию.У тебя какя версия компилера?
И еще-я бы тебе посоветовал тщательнее анализировать код самостоятельно,да и симуляторы(та-же студия)иногда здорово помогают,учитывая,что функции у тебя простые и прогнать через симулятор много времени не займет.
И еще-быть малость,как-бы помягче,поскромнее,что-ли. cranky.gif Я тут сам недавно и отнюдь не профи,
твои грабли мне знакомы smile.gif ,но в большинстве других форумов тебя-бы,имхо,уже давно забанили или в
лучшем случае снесли-бы тему.А здесь активно помогают,что ты почему-то не оцениваешь.
В общем-меньше пиши-больше думай. wink.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 15 2006, 21:20
Сообщение #48


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zheka @ Mar 15 2006, 19:50) *
Ну? 1 функция у меня уже есть. - для флеш.
2-я простите, а выводить строки из eeprom напрямую можно? По-моему нет, раз создатели примеров в CodeVision выводят данные из eeprom помещая их в RAM. Предыдущий мой пост читали? Или опять нет? Я же там жалуюсь что стандартный пример не работает, прошу найтм ошибку.

Если Вы смотрели мой предыдущий пример, то там как раз предполагается последовательное чтение символов строки (неважно откуда) а в переменную "c" с последующим выводом "c" через LcdChr()..

Примеры чтения/записи eeprom можете взять из даташита или поискать в appnotes, или поискать на этом форуме (тут были отдельные ветки посвященные исключительно этому вопросу)..
Go to the top of the page
 
+Quote Post
Petka
сообщение Mar 16 2006, 07:33
Сообщение #49


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(defunct @ Mar 15 2006, 20:06) *
...
2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)


Любопытно, а почему так выгоднее?
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 16 2006, 14:44
Сообщение #50


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Итак господа, продолжаем расследование.
Смеялись вы надо мной, отсылали к мануалам, а я говорил, что проблема кроется не то чтобы в глубине, а где-то в стороне.

Вот вам код №1

Цитата
//char *strings[]={"One","Two","Three"};
const unsigned char c[]="asfasfasf";
flash unsigned char f[]="12345";
#pragma warn-
eeprom unsigned char e[16];
#pragma warn+
unsigned char r[16];


flash char *flash MainMenu[]=
{
"Поиск",
"Каналы",
"Настройка"
};


/////////////////////////////////////////////////////////////////


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

LcdInit();
Delay();
LcdGotoXY(2,2);

for (i=0;i<3;i++)
{
LcdGotoXY(2,i+1);
sprintf(s,"%p", MainMenu[i]);
LcdStr(FONT_1X, s, NORMAL);
LcdLine(1,30+i*5,40,30+i*5,PIXEL_ON);
LcdUpdate();
}



}



Код рабочий. Выводит все строки на экран. Функция LcdLine здесь для отладки. Т.е. если текста нет, линия есть, значит переменная ничему не равна. Если нет ни текста ни линий, значит программа просто виснет при попытке вывести строку. Ну простите мне дилетанту, отлаживаю как могу.

Так вот, код рабочий, все нормально. Прошу вас обратить внимание, строка №1 - char *strings[]={"One","Two","Three"}; закомментирована.

Убираем комментарий.... Вуаля!!! И ни текста, ни линий. к переменной strings в функции main вообще обращения нет. Cудя по отсутствию линий на экране - программа виснет сразу при обращении к функции sprintf. Начинаем ковырять: ставим комментарий у строки №7 unsigned char r[16]; Вуаля! И все снова работает, и по барабану - стоит ли комментарий у строки №1

Ваше мнение, господа?

P.S. одно время у меня выводилась и strings[i], сейчас нет - коврыяюсь в поисках причины.

Сообщение отредактировал zheka - Mar 16 2006, 14:47
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 16 2006, 15:46
Сообщение #51


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А куда указывает указатель s?

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

Сообщение отредактировал beer_warrior - Mar 16 2006, 15:48


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 16 2006, 16:15
Сообщение #52


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



На строку 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#
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 16 2006, 16:32
Сообщение #53


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



zheka
А ругаться не надо. Внимательно прочтите мой пост, и увидите, что цитируется в нём пост №42, а никакой не №30.
Это простая невнимательность или провокация флейма?


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 16 2006, 16:51
Сообщение #54


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 16 2006, 17:05
Сообщение #55


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Вдогонку,
совершенно непонятно зачем нужен 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);


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 16 2006, 17:33
Сообщение #56


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
А ругаться не надо. Внимательно прочтите мой пост, и увидите, что цитируется в нём вовсе не №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. Обещаю тщательно почитать мануал, прежде чем идти к вам с новыми вопросами.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 16 2006, 17:45
Сообщение #57


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



И strcpy тоже работает.

И все же, объясните, в чем разница между
flash char *ptr_to_flash1=”This string is placed in FLASH”;
и
char flash *ptr_to_flash2=”This string is also placed in FLASH”;
?
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 16 2006, 18:07
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



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],'%');


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 16 2006, 18:13
Сообщение #59


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А вот это же детали конкретного компилятора.
char* x = ""; указыват на строку в ОЗУ.
flash, __flash, PROGMEM это модификатор указывающий что данные во флэше.Как он используеться зависит от компиялятора.Тут чистый случай RTFM.
Замечу что и данные должны помечаться как флэш и указатель тоже должен быть на флэш.

2WHALE
конечно, и я об этом писал, но в приведенном коде он явно излишен.
Константные строки однако.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 16 2006, 18:15
Сообщение #60


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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


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

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

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

Сообщение отредактировал defunct - Mar 16 2006, 18:52
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 Текстовая версия Сейчас: 20th July 2025 - 07:31
Рейтинг@Mail.ru


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