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

 
 
 
Reply to this topicStart new topic
> printf в DLIB и CLIB, отличия в реализациях
Andy_F
сообщение Jul 27 2006, 18:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



В процессе освоения IAR возник следующий вопрос:

Есть программа на C (не на C++), в которой хочется применить printf(). Для этого, как известно из других реализаций C, необходимо переопределить putchar() (иногда putch()).

В то же время, в документации вроде бы утверждается, что библиотека CLIB является рудиментом, её использование нежелательно, и пользуйтесь, дорогие товарищи, DLIB.

Так вот, при попытке воспользоваться printf() совместно с DLIB выяснилось, что в этом случае надо пререопределять не __puthar(), а __write() со всякой галиматьёй вроде handle потока вывода.

Во первых, write в таком контексте - это C++, а во вторых мне такой вариант не нужен в данном случае. Получается, хочешь пользоваться printf в C-варианте - пользуйся CLIB ? blink.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 27 2006, 20:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Andy_F @ Jul 27 2006, 21:22) *
Есть программа на C (не на C++), в которой хочется применить printf().

Это он для существующего putchar() хочет write().
А Вам свой нужен, например, такой:

Код
int putchar( int char )
{    
    my_out_char( char );
    return( 0 );
}


А вообще, даже в мыслях не было в свое время заморачиваться вопросом с __putchar, ибо сразу привычно набивается что-то типа:
Код
void bprintf( char *arg_list, ...)
{
va_list arg_buffer;
char *tbptr = tobuf;
    va_start( arg_buffer, arg_list );
    vsprintf( tobuf, arg_list, arg_buffer );
      while( *tbptr )
        boutchar( *tbptr++ );
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Jul 27 2006, 20:38
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



[quote name='zltigo' date='Jul 28 2006, 00:11' post='138541']
Это он для существующего putchar() хочет write().
А Вам свой нужен, например, такой:

Код
int putchar( int char )
{    
    my_out_char( char );
    return( 0 );
}


Я с этого и начал, но при DLIB IAR со мной не согласился, только при CLIB... sad.gif

[quote name='zltigo' date='Jul 28 2006, 00:11' post='138541']
А вообще, даже в мыслях не было в свое время заморачиваться вопросом с __putchar, ибо сразу привычно набивается что-то типа:
Код
void bprintf( char *arg_list, ...)
{
va_list arg_buffer;
char *tbptr = tobuf;
    va_start( arg_buffer, arg_list );
    vsprintf( tobuf, arg_list, arg_buffer );
      while( *tbptr )
        boutchar( *tbptr++ );
}

[/quote]

В таком варианте надо буфер выделять, потом этот буфер своими силами (boutchar) в цикле куда-то посылать. Для меня это лишнее, мне надо вывод на LCD, и удобно было-бы просто в качестве putchar() написать "обёртку" для процедуры вывода символа.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 27 2006, 20:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Andy_F @ Jul 27 2006, 23:38) *
Я с этого и начал, но при DLIB IAR со мной не согласился, только при CLIB... sad.gif

Что-то Вы запутались, не пойму только в чем. С DLIB работает (линковка библиотек dl4xxxx ) При этом действительно требует write(), но как вызов из обертки printchar(), но printchar() то ставите свой.

Цитата(zltigo @ Jul 28 2006, 00:11) *
В таком варианте надо буфер выделять, потом этот буфер своими силами (boutchar) в цикле куда-то посылать. Для меня это лишнее, мне надо вывод на LCD, и удобно было-бы просто в качестве putchar() написать "обёртку" для процедуры вывода символа.

printf() тоже накладные расходы имеет :-(. Буфер может быть статическим общего назначения.
Ну а если LCD примитивный символьный, то вполне возможно через буфер удобнее строчку выводить. Если, например, несколько задач к медленному LCD должны лазить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Jul 28 2006, 08:01
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Спасибо. Попробую ещё раз.
Go to the top of the page
 
+Quote Post

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

 


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


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