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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Запутался с указателями и строками в CodeVision
Зверюга
сообщение Jan 31 2008, 14:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 - ничего не выходит.
Слабоват я в указателях - ткните носом.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jan 31 2008, 14:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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 он обозначается просто как переменная...в опсчем ставьте амперсанд - должно помоч, если нет - тогда смотрите в асм-код...
Go to the top of the page
 
+Quote Post
mrKirill
сообщение Jan 31 2008, 16:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391



Код примера точно для CodeVision?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 31 2008, 20:38
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 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. Включите ВСЕ предупреждения компилятора и посмотрите вывод после сборки (часто спасает от дурацких ошибок)


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2008, 21:17
Сообщение #5


кекс
******

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



Цитата
У меня же ничего не выводится.

может совсем не в указателях дело?

вы вначале убедитесь что этот - put_char(...) зверек работает:
напр напечатать символ 'A':
put_char(0, 0, 'A', 0, f8x14, black);

А потом будет думать, что у вас там со sprintf и всем остальным.
Go to the top of the page
 
+Quote Post
bzx
сообщение Jan 31 2008, 21:40
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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, но думаю, что сделано определение через #define

4. К посту 4 добавлю, что надо сделать так же преобразование типа указателя на buffer. Действительно, объявление двумерного массива непонятно, проще надо:
Код
u08 buffer[4];


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2008, 23:14
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 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 вообще.
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Feb 1 2008, 06:20
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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 - не работает.
Прикрепленные файлы
Прикрепленный файл  S65_Test_CV.rar ( 100.78 килобайт ) Кол-во скачиваний: 45
 
Go to the top of the page
 
+Quote Post
bzx
сообщение Feb 1 2008, 07:53
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Feb 1 2008, 09:13
Сообщение #10


Гуру
******

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



2 defunct - под рукой конечно счас нету винавра и студии, но всё же есть такой код:

void ram_to_lcd(...,unsigned char*str,...)
{
...
put_char(x+i*CHAR_W,y,*str++,rot,font,color); // 0 deg. rotated
...
}

То есть вы хотите сказать что подставив variable и &variable - я получу одинаковые результаты ?
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Feb 1 2008, 10:44
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 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е и вывести на экран.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 1 2008, 11:10
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
bzx
сообщение Feb 1 2008, 11:13
Сообщение #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
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 1 2008, 11:52
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Feb 1 2008, 12:09
Сообщение #15


Гуру
******

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



2 defunct - стоп:
1) "...Если variable - массив, тогда что variable и &variable равны...."

2) "...Даже без студии - один из вариантов компилиться не будет. Еслим будет - компилятор на свалку. ..."

Всмысле - как это понимать ? Вроде одно противоречит другому.....

На счёт приведения типов - я согласен, и согласен что если вместо &variable подставлю variable - работать не будет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:13
Рейтинг@Mail.ru


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