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

 
 
 
Reply to this topicStart new topic
> sprintf();, Не могу заставить работать
andrvisht
сообщение Dec 28 2005, 09:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Для перевода числа в строку LCD ранее пользовался делением на 10.
Поскольку в С есть функция sprintf() то логичнее было бы использовать её.
подключил файл <stdio.h>
выбрал в опциях библиотеку Normal DLIB
и для начала решил попробовать функцию printf
прямо из help взял пример
Код
  printf("%hu", 0xffff);
  printf("%s", "hello");
  printf("%d %o %x", 31, 31, 31);

и на все получил ошибку
Error[Pe167]: argument of type "char __farflash *" is incompatible with parameter of type "char const *

Эксперименты с разными библиотеками ничего не дали sad.gif
Что не так ?
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 28 2005, 09:50
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



для строк из флеша надо использовать
printf_P


В доке на компилер есть раздел
AVR–specific library routines
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 28 2005, 09:52
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ Dec 28 2005, 11:50) *
для строк из флеша надо использовать
printf_P


В доке на компилер есть раздел
AVR–specific library routines

И подключить при этом pgmspace.h
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 28 2005, 09:54
Сообщение #4


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(&-rey @ Dec 28 2005, 12:21) *
Для перевода числа в строку LCD ранее пользовался делением на 10.
Поскольку в С есть функция sprintf() то логичнее было бы использовать её.
подключил файл <stdio.h>
выбрал в опциях библиотеку Normal DLIB
и для начала решил попробовать функцию printf
прямо из help взял пример
Код
  printf("%hu", 0xffff);
  printf("%s", "hello");
  printf("%d %o %x", 31, 31, 31);

и на все получил ошибку
Error[Pe167]: argument of type "char __farflash *" is incompatible with parameter of type "char const *

Эксперименты с разными библиотеками ничего не дали sad.gif
Что не так ?

Для этого конечно (Для перевода числа в строку LCD) лучше использовать sprintf(), т.к. непосредственно указывается адрес буфера преобразования. Для printf() это надо переопределять, поэтому и выдается ошибка. Так же есть еще один момент, необходимо выделить большой объем стека что бы функции sprintf()/printf() работали без ошибок. Но из собственного опыта - предпочтительней (пользоваться делением на 10). Так и место во flash экономиться за счет неиспользования библиотек для sprintf и немного быстрее работает программа.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Dec 28 2005, 10:09
Сообщение #5


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

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



Если не надо генерить сложной строки из разнотипных данных
лучше воспользоваться itoa()/atoi() etc.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Dec 28 2005, 10:38
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(IgorKossak @ Dec 28 2005, 13:52) *
И подключить при этом pgmspace.h

Да, сделал
Код
  printf_P("%hu", 0xffff);
  printf_P("%s", "Hello word");
  printf_P("%d %o %x", 31, 31, 31);


но во первых не понятно почему строк из FLASH, где это видно ?
может в документации и описано но я английским с переводчиком владею, может что и упускаю.

Цитата(BVU @ Dec 28 2005, 13:54) *
Но из собственного опыта - предпочтительней (пользоваться делением на 10). Так и место во flash экономиться за счет неиспользования библиотек для sprintf и немного быстрее работает программа.

Спасибо так и сделаю, но все таки хотелось бы понять с printf до конца. Может когда и пригодиться.
И тогда еще вопрос по делению на 10
мне нужен результат целое + остаток конечно можно одельно ползовать / и % отдельно но может есть все сразу ?


Цитата(beer_warrior @ Dec 28 2005, 14:09) *
Если не надо генерить сложной строки из разнотипных данных
лучше воспользоваться itoa()/atoi() etc.

Ясно попробую, atoi пользовал но код мне показался избыточным, может за счет универсализации...
Go to the top of the page
 
+Quote Post
_artem_
сообщение Dec 28 2005, 10:44
Сообщение #7


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



vot kak atmel eto delaet :

AVR204: BCD Arithmetics
http://www.atmel.com/dyn/resources/prod_do...nts/doc0938.pdf

voobse to printf() opchen gromozdkaya funkciya . Ne znaju naskolko optimiziruetsja kompajlerom . Esli tolko s ciframi imeete delo to imeet smisl ispolzovat svoyu funkciyu dlja etogo , bolee optimizirovannuju chem printf()


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 28 2005, 10:45
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(&-rey @ Dec 28 2005, 12:38) *
но во первых не понятно почему строк из FLASH, где это видно ?
может в документации и описано но я английским с переводчиком владею, может что и упускаю.

Тип операндов указан в обьявлении функции. При вызове функции происходит неявное преобразование если необходимо.
Цитата(&-rey @ Dec 28 2005, 12:38) *
Цитата(BVU @ Dec 28 2005, 13:54) *

Но из собственного опыта - предпочтительней (пользоваться делением на 10). Так и место во flash экономиться за счет неиспользования библиотек для sprintf и немного быстрее работает программа.

Спасибо так и сделаю, но все таки хотелось бы понять с printf до конца. Может когда и пригодиться.
И тогда еще вопрос по делению на 10
мне нужен результат целое + остаток конечно можно одельно ползовать / и % отдельно но может есть все сразу ?

Целое и остаток выдаёт библиотечная функция div() см. clibrary.pdf на стр. 9.
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 28 2005, 10:59
Сообщение #9


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(&-rey @ Dec 28 2005, 13:38) *
но во первых не понятно почему строк из FLASH, где это видно ?
может в документации и описано но я английским с переводчиком владею, может что и упускаю.


У вас наверное активна опция --string_literals_in_flash
Puts "string" in the __nearflash or __farflash segment depending on the processor
option.
When this option is selected, library functions taking a string literal as a parameter will
no longer be type-compatible.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Dec 28 2005, 13:18
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



to KRS:
посмотрел и галочки убрал но результат тот-же sad.gif
to _artem_:
Спасибо, но прблем с алгоритмами у меня нет, просто хотел именно sprintf испробовать,
а тогда уже решить : писать свое или пользовать библиотеки.
to IgorKossak:
Ясно, я искал поначалу именно такую, но не нашел. теперь ясно где. только в 4.11A это уже clib.pdf

И еще вопрос ко всем:
часто русский шрифт в LCD приходиться кодировать Hex кодом. Нет ли в IAR возможности это делать автоматом ?
Мне приходит в голову только табличная перекодировка, но это доп. затраты ресурсов проца, а ведь все можно сделать на этапе компиляции.

Сообщение отредактировал &-rey - Dec 28 2005, 13:19
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 28 2005, 13:40
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(&-rey @ Dec 28 2005, 15:18) *
часто русский шрифт в LCD приходиться кодировать Hex кодом. Нет ли в IAR возможности это делать автоматом ?
Мне приходит в голову только табличная перекодировка, но это доп. затраты ресурсов проца, а ведь все можно сделать на этапе компиляции.

IAR здесь не при чём. В самом языке С препроцессор очень слаб.
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 28 2005, 13:41
Сообщение #12


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(&-rey @ Dec 28 2005, 16:18) *
to KRS:
посмотрел и галочки убрал но результат тот-же sad.gif
to _artem_:
Спасибо, но прблем с алгоритмами у меня нет, просто хотел именно sprintf испробовать,
а тогда уже решить : писать свое или пользовать библиотеки.
to IgorKossak:
Ясно, я искал поначалу именно такую, но не нашел. теперь ясно где. только в 4.11A это уже clib.pdf

И еще вопрос ко всем:
часто русский шрифт в LCD приходиться кодировать Hex кодом. Нет ли в IAR возможности это делать автоматом ?
Мне приходит в голову только табличная перекодировка, но это доп. затраты ресурсов проца, а ведь все можно сделать на этапе компиляции.

Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает... sad.gif


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Dec 28 2005, 14:23
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(BVU @ Dec 28 2005, 17:41) *
Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает... sad.gif

тогда наверное так:
#define 'A' 0x41
а строки писать 'Р','у','с','с','к','и','й'
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 29 2005, 07:55
Сообщение #14


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(&-rey @ Dec 28 2005, 17:23) *
Цитата(BVU @ Dec 28 2005, 17:41) *

Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает... sad.gif

тогда наверное так:
#define 'A' 0x41
а строки писать 'Р','у','с','с','к','и','й'

Совершенно верно, но тоже неудобно. sad.gif
В подобных случаях обычно используют программы перекодировщики типа: HD44780.exe


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post

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

 


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


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