Функция printf() неявно использует переменную stdout для своей работы, т.е. она делает то же, что и fprintf( stdout, ... ). Такое поведение определяется стандартом языка C. Есть три зарезервированных переменных типа указатель на FILE.
Да это верно, именно так.
вот я и для этого делал: у меня был свой поток
//тут разные инклюды
static FILE
stdout_LCD = FDEV_SETUP_STREAM(
uart_putchar, NULL, _FDEV_SETUP_WRITE );
main()
{
// вот это же мой поток выделен красным stdout_LCD
// и тут я присваиваю свой поток к stdout командой stdout=&stdout_LCD;
stdout=&stdout_LCD;
//ну потом можно уже
print("hello"); //
а не fprint("hello");
вот я же явно присвоил командой stdout=&stdout_LCD; чтобы не пришлось писать fprintf();
}
с этим я согласен : "Функция printf() неявно использует переменную stdout для своей работы, т.е. она делает то же, что и fprintf( stdout, ... )."
Конечно хочу поблагодарить всех кто отозвался на мой вопрос.
но не пойму я следующие:
припустим я хочу через поток работать с lcd дисплеем и мне надо написать функцию-драйвер для printf().
т.е в строке static FILE stdout_LCD = FDEV_SETUP_STREAM(
lcd_driver, NULL, _FDEV_SETUP_WRITE );
и вот тут при создании потока выделено красным я говорю что функция которая будет отвечать за отправку символа будет
lcd_driver
и вот тут следующие вопросы
пример кода
# include подключаем нужные файлы
static FILE stdout_LCD = FDEV_SETUP_STREAM(
lcd_driver, NULL, _FDEV_SETUP_WRITE); // вот тут lcd_driver это та функция которая отвечает за отправку символа или строки , но главное не это
потом
main()
{
print("hello");
}
void lcd_driver(char c)
{
// функция отправляет символ, описывать функцию думаю не надо.
}
все можно сказать код рабочий за том исключением что тут нет функ. инициализации дисплея.
ВОТ ТУТ САМОЕ ГЛАВНОЕ, ТАК КОМПИЛЯТОР РУГАЕТСЯ, Т.Е ЕСТЬ ВОРНИНГ
Warning 1 initialization from incompatible pointer type
но код работает, теперь я в этой функ. т.е void lcd_driver(char c) добавляю FILE *stream и получается void lcd_driver(char c, FILE * stream);
ВСЕ ВОРНИНГА НЕТ
КАК ЭТО ?
и соответственно я не могу теперь использовать функ. lcd_driver напрямую только через printf()
если вспомнить мой первый пост, т.е сам вопрос там есть пример кода только для uart то в функ.
int uart_putchar(char c, FILE *stream) Я ЯВНО ЖЕ НЕ ИСПОЛЬЗУЮ FILE *stream , зачем тогда второй параметр. может я что-то не допонял.
{
if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;