Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Правильно ли я понял...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
SasaVitebsk
1. Правильно ли я понял, что если я напишу свои функции обработчики getchar и putchar, то смогу использовать библиотечные функции puts/gets а также printf/scanf и они будут применимы к тем же устройствам ввода/вывода, что и мои ф-ии. Иными словами будут работать ч/з мои ф-ии.

Если да, то второй вопрос.
Можно ли реализовать такую работу одновременно с двумя устройствами I/O. Например переназначая адреса (присваиванием) данных функций.
Ну типа так.

int putchar_lcd(int c);
int putchar_232(int c);
int putchar(int c);
...
putchar = puchar_lcd;
puts('вывод на lcd');
...
putchar = puchar_232;
puts('вывод на 232');
...

В паскале указывается ус-во I/O. А здесь как?
_artem_
Может Вам стОит сделать функцию переназначения устройства ввода вывода там где Вы создали putchar() i гетчар() и по надобности вызывать ее перед применением стандартных принтф ...?
rezident
Цитата(_artem_ @ Sep 29 2006, 03:07) *
Может Вам стОит сделать функцию переназначения устройства ввода вывода там где Вы создали putchar() i гетчар() и по надобности вызывать ее перед применением стандартных принтф ...?

Или в putchar ввести переключатель потоков по наличию управляющих символов. Типа ESC-последовательностей передаваемых в printf.
IgorKossak
Или воспользоваться функцией sprintf() и выводить в массив, из которого уже можно выводить в устройства соответствующими драйверами/функциями.
rezident
Цитата(IgorKossak @ Sep 29 2006, 17:46) *
Или воспользоваться функцией sprintf() и выводить в массив, из которого уже можно выводить в устройства соответствующими драйверами/функциями.

Только не нужно забывать, что это слишком "жручая" по размеру стека функция. От сотни байт до 1,5 кБайт стека может потребоваться.
zltigo
Цитата(rezident @ Sep 29 2006, 15:05) *
Цитата(IgorKossak @ Sep 29 2006, 17:46) *

Или воспользоваться функцией sprintf() и ..

Только не нужно забывать, что это слишком "жручая" по размеру стека функция.

B printf() и sprintf() это с точки зрения ресурсов одинаковы и являются во всех виданных мною реализациях библиотек оберткой некой базовой функции. Практически единственное существенное отличие в ресурсах это прмежуточный буфер для sptintf(), который в некоторых случаях может сослужить пользу.
rezident
Цитата(zltigo @ Sep 29 2006, 18:52) *
Цитата(rezident @ Sep 29 2006, 15:05) *

Цитата(IgorKossak @ Sep 29 2006, 17:46) *

Или воспользоваться функцией sprintf() и ..

Только не нужно забывать, что это слишком "жручая" по размеру стека функция.

B printf() и sprintf() это с точки зрения ресурсов одинаковы и являются во всех виданных мною реализациях библиотек оберткой некой базовой функции. Практически единственное существенное отличие в ресурсах это прмежуточный буфер для sptintf(), который в некоторых случаях может сослужить пользу.

Я имел в виду обе функции. Про sprintf не помню цифры. А вот print у меня недавно для вывода всего навсего одного единственного числа типа float в формате с выравниваем влево и урезанием до двух знаков после запятой потребовала 102 или 108 байт ОЗУ sad.gif
SasaVitebsk
Спасибо за ответы. Не обижайтесь пожалуйста, но я не спрашивал как лучше это реализовать. Я прекрасно смогу это сделать включая буферизацию управление потоком и т.д. и т.п. Я задавал вопрос академически. Меня интересует да или нет. Насколько я смог понять, то на первый вопрос ответ положительный.

Хочу немного лучше понять Си. А то я и на Си пишу как на ассемблере. smile.gif
_Bill
Цитата(SasaVitebsk @ Sep 30 2006, 01:56) *
Хочу немного лучше понять Си. А то я и на Си пишу как на ассемблере. smile.gif

Рискну предложить ознакомиться с этим материалом "Си без Си".
SasaVitebsk
Имеется вот такая процедура.
/**********************************************************

Name: void lprintf()

Description: Write a formated string to the LCD

Input:

Output: none

Misc:

**********************************************************/
int lprintf(char *fmt, ...)
{
va_list va;
int val;

va_start(va, fmt);
val = _print((void (*)())_lcdputc, fmt, va);
va_end(va);

return val;
}

Непонятно следующее:
int lprintf(char *fmt, ...)

Этого я не встречал в языке. Возможно я был невнимателен, но пожалуйста поясните что означают эти три точки. Как их трактовать и зачем применять.
zltigo
Цитата(SasaVitebsk @ Oct 4 2006, 23:57) *
Этого я не встречал в языке.

Не всречал :-)... Довольно продолжительная беседа о
int printf(const char *, ...);
Думаю, что все стало сразу ясным? - и как трактовать, и как применять...
IgorKossak
Цитата(SasaVitebsk @ Oct 4 2006, 23:57) *
... пожалуйста поясните что означают эти три точки. Как их трактовать и зачем применять.

Ну это уж совершенные азы. Вам надо у Кернигана и Ричи об этом почитать (функции с переменным числом аргументов).
Без таких азов даже садиться за программирование не стоит.
Здесь Вам могут помочь в разъяснении некоторых неясных моментов, не более, но не обучать же Вас с нуля.
SasaVitebsk
Цитата(IgorKossak @ Oct 5 2006, 11:22) *
Ну это уж совершенные азы. Вам надо у Кернигана и Ричи об этом почитать (функции с переменным числом аргументов).
Без таких азов даже садиться за программирование не стоит.
Здесь Вам могут помочь в разъяснении некоторых неясных моментов, не более, но не обучать же Вас с нуля.


Ну ни грама не стыдно. smile.gif
Я же не скрываю (можно просмотреть мои топики) что начал изучать С с полгода назад.
И вот именно об этом и говорю что использую С как ассемблер. То есть беру и пишу
всё подряд. Ну в данном случае сам пишу putchar, puts (возможно со своим названием smile.gif )
Если необходимо, то самостоятельно осуществляю форматирование текста... Короче пишу
так как я писал бы на ассемблере (а здесь у меня опыт большой) только используя Си-шные
типы данных и операторы.
Убеждён что знание синтаксиса языка - недостаточно. Должен появится опыт программирования на данном языке. Потому, что как правило используются не отдельные операторыа целые конструкции. И ты начинаешь мыслить этими конструкциями. А к ним надо придти. Это просто опыт. Длительный опыт. Пробуешь писать так и этак. О! Так красивее получилось. Ну и так далее.
Изучал С по книге Шилда. Там переменному числу параметров уделено 11 строк текста. И
то в разделе по нюансам типа разнице м/у С89 и С99. Пропустил. Пеперь всё стало на свои места.
Ну не всё пока. smile.gif Думаю года ч/з два-три. И то учитывая что я писал понемногу на
Fortran-IV, Fortran-77, PL/1, PL/M, Basic, Pascal.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.