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

 
 
 
Reply to this topicStart new topic
> Правильно ли я понял..., Вопрос по функции printf
SasaVitebsk
сообщение Sep 28 2006, 20:07
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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. А здесь как?
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 28 2006, 21:07
Сообщение #2


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

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



Может Вам стОит сделать функцию переназначения устройства ввода вывода там где Вы создали putchar() i гетчар() и по надобности вызывать ее перед применением стандартных принтф ...?


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

Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 29 2006, 09:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Или в putchar ввести переключатель потоков по наличию управляющих символов. Типа ESC-последовательностей передаваемых в printf.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 29 2006, 11:46
Сообщение #4


Шаман
******

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



Или воспользоваться функцией sprintf() и выводить в массив, из которого уже можно выводить в устройства соответствующими драйверами/функциями.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 29 2006, 12:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Только не нужно забывать, что это слишком "жручая" по размеру стека функция. От сотни байт до 1,5 кБайт стека может потребоваться.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 29 2006, 12:52
Сообщение #6


Гуру
******

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



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

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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 29 2006, 14:39
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 29 2006, 22:56
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо за ответы. Не обижайтесь пожалуйста, но я не спрашивал как лучше это реализовать. Я прекрасно смогу это сделать включая буферизацию управление потоком и т.д. и т.п. Я задавал вопрос академически. Меня интересует да или нет. Насколько я смог понять, то на первый вопрос ответ положительный.

Хочу немного лучше понять Си. А то я и на Си пишу как на ассемблере. smile.gif
Go to the top of the page
 
+Quote Post
_Bill
сообщение Oct 2 2006, 08:02
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

Рискну предложить ознакомиться с этим материалом "Си без Си".
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 4 2006, 20:57
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Имеется вот такая процедура.
/**********************************************************

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, ...)

Этого я не встречал в языке. Возможно я был невнимателен, но пожалуйста поясните что означают эти три точки. Как их трактовать и зачем применять.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 5 2006, 04:35
Сообщение #11


Гуру
******

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



Цитата(SasaVitebsk @ Oct 4 2006, 23:57) *
Этого я не встречал в языке.

Не всречал :-)... Довольно продолжительная беседа о
int printf(const char *, ...);
Думаю, что все стало сразу ясным? - и как трактовать, и как применять...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 5 2006, 08:22
Сообщение #12


Шаман
******

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



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

Ну это уж совершенные азы. Вам надо у Кернигана и Ричи об этом почитать (функции с переменным числом аргументов).
Без таких азов даже садиться за программирование не стоит.
Здесь Вам могут помочь в разъяснении некоторых неясных моментов, не более, но не обучать же Вас с нуля.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 5 2006, 22:45
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(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.
Go to the top of the page
 
+Quote Post

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

 


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


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