|
|
  |
sprintf();, Не могу заставить работать |
|
|
|
Dec 28 2005, 09:21
|
Местный
  
Группа: Свой
Сообщений: 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 * Эксперименты с разными библиотеками ничего не дали  Что не так ?
|
|
|
|
|
Dec 28 2005, 09:54
|

Профессионал
    
Группа: Свой
Сообщений: 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 * Эксперименты с разными библиотеками ничего не дали  Что не так ? Для этого конечно (Для перевода числа в строку LCD) лучше использовать sprintf(), т.к. непосредственно указывается адрес буфера преобразования. Для printf() это надо переопределять, поэтому и выдается ошибка. Так же есть еще один момент, необходимо выделить большой объем стека что бы функции sprintf()/printf() работали без ошибок. Но из собственного опыта - предпочтительней (пользоваться делением на 10). Так и место во flash экономиться за счет неиспользования библиотек для sprintf и немного быстрее работает программа.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Dec 28 2005, 10:38
|
Местный
  
Группа: Свой
Сообщений: 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 пользовал но код мне показался избыточным, может за счет универсализации...
|
|
|
|
|
Dec 28 2005, 10:45
|

Шаман
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Dec 28 2005, 10:59
|

Профессионал
    
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Dec 28 2005, 13:18
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
to KRS: посмотрел и галочки убрал но результат тот-же  to _artem_: Спасибо, но прблем с алгоритмами у меня нет, просто хотел именно sprintf испробовать, а тогда уже решить : писать свое или пользовать библиотеки. to IgorKossak: Ясно, я искал поначалу именно такую, но не нашел. теперь ясно где. только в 4.11A это уже clib.pdf И еще вопрос ко всем: часто русский шрифт в LCD приходиться кодировать Hex кодом. Нет ли в IAR возможности это делать автоматом ? Мне приходит в голову только табличная перекодировка, но это доп. затраты ресурсов проца, а ведь все можно сделать на этапе компиляции.
Сообщение отредактировал &-rey - Dec 28 2005, 13:19
|
|
|
|
|
Dec 28 2005, 13:41
|

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

|
Цитата(&-rey @ Dec 28 2005, 16:18)  to KRS: посмотрел и галочки убрал но результат тот-же  to _artem_: Спасибо, но прблем с алгоритмами у меня нет, просто хотел именно sprintf испробовать, а тогда уже решить : писать свое или пользовать библиотеки. to IgorKossak: Ясно, я искал поначалу именно такую, но не нашел. теперь ясно где. только в 4.11A это уже clib.pdf И еще вопрос ко всем: часто русский шрифт в LCD приходиться кодировать Hex кодом. Нет ли в IAR возможности это делать автоматом ? Мне приходит в голову только табличная перекодировка, но это доп. затраты ресурсов проца, а ведь все можно сделать на этапе компиляции. Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Dec 28 2005, 14:23
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(BVU @ Dec 28 2005, 17:41)  Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает...  тогда наверное так: #define 'A' 0x41 а строки писать 'Р','у','с','с','к','и','й'
|
|
|
|
|
Dec 29 2005, 07:55
|

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

|
Цитата(&-rey @ Dec 28 2005, 17:23)  Цитата(BVU @ Dec 28 2005, 17:41)  Попробуйте переобозначить руские символы через #define... от их HEX значения. Но неуверен, что для строки это сработает...  тогда наверное так: #define 'A' 0x41 а строки писать 'Р','у','с','с','к','и','й' Совершенно верно, но тоже неудобно. В подобных случаях обычно используют программы перекодировщики типа: HD44780.exe
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|