[P&AM Lab] crypti printf questions
Mikhail Ilyin
ilyin_mikhail на inbox.ru
Вт Апр 16 11:07:05 MSK 2013
Привет всем, я хотел написать тебе, Боря, еще вчера. Г.А все верно сказал, что ты не до конца
понимаешь, для чего нужны эти ф-ии/макросы в Си. И как хранятся аргументы.
printf(char *fmt, void *args, int nargs)
в твоем предложенном варианте аргументы уже хранятся в подготовленном массиве, и в ф-ию
передаются только указатель на массив, его размерность + конечно же сама форматная строка, так
вот получается на стеке в итоге находится 3 аргумента.
Когда же мы говорим про оригинальную версию printf, то ВСЕ аргументы хранятся в регистрах и/или в
стеке (в зависимости как и сказал Г.А. от ABI), сколько ты их передашь это не имеет значение. И если
посмотреть на реализацию самой printf, то она полагается на форматную строку, и данные извлеченные
из стека/регистров с помощью va_arg интерпретируются согласно спецификации строки, то есть количество
аргументов заведомо не передается.
То есть еще раз:
1. все аргументы живут в стеке/регистрах (нет промежуточного хранилища, типа массива);
2. количество аргументов не передается;
3. форматная строка это то на что полагаются при извлечении аргументов (если строка косячная и не соотвествует
извлеченным данным всего скорее программа скоро завалится, при первом обращении к данным).
Если ты хочешь избавится от количества аргументов в своей реализации и от промежуточного массива, почему
бы тебе не создавать конечную строку динамически, извлекая одновременно операцией pop свои значения
и консультируясь со своей форматной строкой. Посмотри для примера
http://wiki.syktsu.ru/websvn/filedetails.php?repname=litepac&path=%2Fvmlibcall%2Fio.c
Удачи.
Вторник, 16 апреля 2013, 10:43 +04:00 от Борис Липин <lonely.ruyk на mail.ru>:
>Я подумал что с такой интерфейс выглядит более стандартным и каноничным.
>В конечном итоге ведь и printf(3) функции могли реализовать как то вроде:
>printf(char *fmt, void *args, int nargs).
>Спасибо за ответ, наверное я действительно немного не прав относительно интерфейса функций.:)
>
>А вообще есть возможность сделать преобразование array -> va_list или запихать массив в функции с переменным количеством параметров *стандартными средствами* или эта ситуация - совсем не то для чего они используются и о таких вопросах не стоит задумываться?
>
>
>Понедельник, 15 апреля 2013, 21:59 +04:00 от "Grigoriy A. Sitkarev" <sitkarev на komitex.ru>:
>>Всем здоровья!
>>
>>lonely.ruyk wrote:
>>> Небольшой вопрос по поводу va_list:
>>> Сейчас интерфейс функции форматированного вывода выглядит так:
>>>
>>> int var_print_formatted(struct variable *fmt, struct variable **args,
>>> int nargs);
>>>
>>> хотелось бы сделать чтобы она выглядела как то так
>>>
>>> int var_print_formatted(struct variable *fmt, va_list ap);
>>> или так
>>> int var_print_formatted(struct variable *fmt, ...);
>>>
>>
>>Я думаю, что тебе не совсем понятно, откуда вообще взялся va_list и
>>сопровождающие его макросы va_start(), va_end(), va_copy() и va_arg().
>>Они появились для того, чтобы обеспечить переносимость Си функций,
>>принимающих переменное количество аргументов, с одной машины на другую,
>>без привязок к особенностям ABI.
>>
>>В твоём случае мы имеем дело с интерпретатором, где сами переменные и
>>аргументы при вызове функций хранятся некоторым образом в его состоянии
>>времени выполнения. Сам интерпретатор может полностью контроллировать
>>сколько значений было передано функции при вызове, поэтому необходимости
>>в va_list для передачи аргументов никакой нет.
>>
>>Чем плох нынешний вариант с передачей аргументов в массиве? В конце
>>концов, кто запрещает сделать структуру
>>
>>struct arg_list {
>>const struct variable **item;
>>int nitems;
>>int nalloc;
>>};
>>
>>int var_print_formatted(const struct variable *fmt, const struct
>>arg_list *args);
>>
>>
>>--
>>Г.А.
>>
>>_______________________________________________
>>Lab mailing list
>>Lab на amplab.syktsu.ru
>>http://amplab.syktsu.ru/cgi-bin/mailman/listinfo/lab
>
>_______________________________________________
>Lab mailing list
>Lab на amplab.syktsu.ru
>http://amplab.syktsu.ru/cgi-bin/mailman/listinfo/lab
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://amplab.syktsu.ru/pipermail/lab/attachments/20130416/ff314b10/attachment.htm>
Подробная информация о списке рассылки Lab