|
Запутался с указателями и строками в CodeVision |
|
|
|
Jan 31 2008, 14:09
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Есть библиотечка под CodeVision - для LCD от Siemens. Там есть функции Код u08 buffer[1][4];
void ram_to_lcd(u08 x,u08 y,unsigned char*str,u08 font,u08 rot, ui16 color) { u08 i=0; while (*str !='\0') { put_char(x+i*CHAR_W,y,*str++,rot,font,color); // 0 deg. rotated i++; x++; }
} //******************************************************вывод строка из ram****************************** void lcd_str_ram(u08 x,u08 y,ui16 var, u08 font,u08 rot,ui16 color) { sprintf(buffer ,"%-i",var); ram_to_lcd(x,y,buffer,rot,font,color);
} Автор библиотеки (один из посетителей этого форума) делает так: Код int variable;
void main() { variable=200; lcd_str_ram(65,75,variable,f8x14,0,black);
} У меня же ничего не выводится. Пробовал через sprintf - ничего не выходит. Слабоват я в указателях - ткните носом.
|
|
|
|
|
Jan 31 2008, 14:37
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 Зверюга - как то оно на первый взгляд смотрится.. мм.. Я не силён в ЛЦД,не в курсе что там и как, но всё же - в опсчем попробуйте вместо
lcd_str_ram(65,75,variable,f8x14,0,black);
заюзать
lcd_str_ram(65,75,&variable,f8x14,0,black);
По идее должно сработать - в ram_to_lcd - 3-й параметр указатель, а в lcd_str_ram он обозначается просто как переменная...в опсчем ставьте амперсанд - должно помоч, если нет - тогда смотрите в асм-код...
|
|
|
|
|
Jan 31 2008, 20:38
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(Зверюга @ Jan 31 2008, 17:09)  Код u08 buffer[1][4];
//******************************************************вывод строка из ram****************************** void lcd_str_ram(u08 x,u08 y,ui16 var, u08 font,u08 rot,ui16 color) { sprintf(buffer ,"%-i",var); ^^^^^ ram_to_lcd(x,y,buffer,rot,font,color);
} Буфер объявлен как двумерный массив, а зачем? И еще не соответствие типов u08 и, думаю, char в sprintf. Включите ВСЕ предупреждения компилятора и посмотрите вывод после сборки (часто спасает от дурацких ошибок)
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 31 2008, 21:17
|

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

|
Цитата У меня же ничего не выводится. может совсем не в указателях дело? вы вначале убедитесь что этот - put_char(...) зверек работает: напр напечатать символ 'A': put_char(0, 0, 'A', 0, f8x14, black); А потом будет думать, что у вас там со sprintf и всем остальным.
|
|
|
|
|
Jan 31 2008, 21:40
|

Местный
  
Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528

|
1. Повнимательнее посмотри, что передаёшь в качестве параметров в функции lcd_str_ram при обращении к ram_to_lcd в переменных 4 и 5. 2. Абсолютно уместно замечание поста 2. Плюс, перед вызовом в variable надо что то запихнуть и сделать преобразование типа указателя: Код variable = "x"; lcd_str_ram(65,75,(unsigned char*)&variable,f8x14,0,black); 3. Несколько непонятно что за хрень скрывается за надписью f8x14, но думаю, что сделано определение через #define4. К посту 4 добавлю, что надо сделать так же преобразование типа указателя на buffer. Действительно, объявление двумерного массива непонятно, проще надо: Код u08 buffer[4];
--------------------
Для связи email: info собака qbit.su
|
|
|
|
|
Jan 31 2008, 23:14
|

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

|
Цитата(bzx @ Feb 1 2008, 00:40)  2. Абсолютно уместно замечание поста 2. Плюс, перед вызовом в variable надо что то запихнуть и сделать преобразование типа указателя: Замечание как раз наоборот не уместное, т.к. массив и есть указатель, buffer и &buffer эквивалентны. Наоборот старайтесь избегать записей вида &массив, потому что в последствии такие записи ведут к глюкам (когда вдруг кто-то захочет поменять массив на указатель). это есть в букваре по C. можете сами проверить Код char buffer[3]; if ( (unsigned)buffer == (unsigned)&buffer) printf("указатель на массив это и есть массив"); else printf("замечание поста 2 уместно"); PS: говорить о чем либо сейчас бесполезно, т.к. мы не знаем наверняка работает ли вывод на LCD вообще.
|
|
|
|
|
Feb 1 2008, 06:20
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Господа, вывод на LCD работает. СТроки из flash выводятся без проблем. Сейчас дам ссылку на всю библиотеку. Там в файле main_program.c есть строки: Код lcd_str_fl(6,65,"Made in CodeVision",f8x14,0,black); // 0 -- значит текст не поворачивать lcd_str_fl(15,25," by BelTech",f8x14,0,red); delay_ms(2000); lcd_clr(); // оистка дисплея //lcd_str_fl(3,65,"variable = ",f8x14,0,black); lcd_str_ram(65,75,variable,f8x14,0,black); // вывести строку из ОЗУ памяти(из переменной variable) lcd_str_fl - работает. lcd_str_ram - не работает.
|
|
|
|
|
Feb 1 2008, 07:53
|

Местный
  
Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528

|
Сделай так Код char variable[32]; ... sprintf ( variable, "variable = " ); lcd_str_ram(65,75,variable,f8x14,0,black);
--------------------
Для связи email: info собака qbit.su
|
|
|
|
|
Feb 1 2008, 10:44
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Цитата char variable[32]; ... sprintf ( variable, "variable = " ); lcd_str_ram(65,75,variable,f8x14,0,black); ЧТо-то я не понял... вы хотите в variable записать текст "variable=" и вывести его на экран? Мне же нужно допустим, математически получить число 200, присвоить это значение переменной variablе и вывести на экран.
|
|
|
|
|
Feb 1 2008, 11:10
|

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

|
Цитата(Kuzmi4 @ Feb 1 2008, 11:13)  То есть вы хотите сказать что подставив variable и &variable - я получу одинаковые результаты ? Даже без студии - один из вариантов компилиться не будет. Еслим будет - компилятор на свалку. Ибо параметром void lcd_str_ram является u16 и попытку передавать вместо него указатель без явного приведения типа компилятор обязан пресекать. Если бы параметром был указатель на char (как в функции ram_to_lcd()) то компилятор тоже обязан отличать array от &array, ибо первый имеет тип char * а второй - char **. array эквивалентен &array[0], т.е. имя массива - это указатель на его нулевой элемент. Цитата(Зверюга @ Feb 1 2008, 12:44)  Мне же нужно допустим, математически получить число 200, присвоить это значение переменной variablе и вывести на экран. Убедитесь сначала, что он у вас хоть что-нибудь выводит при помощи lcd_str_ram(), хоть русский эквивалент "Hello, world!" (слово из трех букв).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 1 2008, 11:13
|

Местный
  
Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528

|
Цитата(Зверюга @ Feb 1 2008, 13:44)  ЧТо-то я не понял... вы хотите в variable записать текст "variable=" и вывести его на экран? Мне же нужно допустим, математически получить число 200, присвоить это значение переменной variablе и вывести на экран. Нет проблем. Код char buf[32]; int variable; ... variable = 1234; sprintf ( buf, "variable = %d", variable ); lcd_str_ram(65,75,buf,f8x14,0,black);
--------------------
Для связи email: info собака qbit.su
|
|
|
|
|
Feb 1 2008, 11:52
|

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

|
Цитата(Kuzmi4 @ Feb 1 2008, 12:13)  То есть вы хотите сказать что подставив variable и &variable - я получу одинаковые результаты ? Если variable - массив, тогда что variable и &variable равны. А результат будет - см. пост Сергея: Цитата Даже без студии - один из вариантов компилиться не будет. Еслим будет - компилятор на свалку. +1 чтобы вариант с &variable заработал, потребуется преобразование типа. после преобразования типа результат будет одинаковым: f(variable) f((u08 *)&variable)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|