Подскажите, плиз, а то совсем запутался. Дано GNU libc. Требуется написать функцию, в которую передается переменное число аргументов, и затем эти аргументы передаются целиком дальше, уже в другую функцию с переменным числом аргуметнов. Собственно как написать ф-цию с переменным числом аргументов не проблема, проблема в том как их подставить в точно такую же функцию.
static int trace_args(char *fmt, ...)
{
int ret_val = 0;
/* тут мы что-то поделали и теперь
* хотим вывести на печать строку */
printf(fmt, /* а вот сюда хочется подставить остальные аргументы, которые ... */);
return (ret_val);
}
int main(int argc, char *argv[])
{
return trace_args("Arg1=%s, Arg2=%s, Arg3=%s", "Hello", "world", "!!!");
}
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re: Как variadic arguments передать дальше в функцию?
Здравствуйте, Latent Force, Вы писали:
LF>Привет!
LF>Подскажите, плиз, а то совсем запутался. Дано GNU libc. Требуется написать функцию, в которую передается переменное число аргументов, и затем эти аргументы передаются целиком дальше, уже в другую функцию с переменным числом аргуметнов. Собственно как написать ф-цию с переменным числом аргументов не проблема, проблема в том как их подставить в точно такую же функцию.
LF>
LF>static int trace_args(char *fmt, ...)
LF>{
LF> int ret_val = 0;
LF> /* тут мы что-то поделали и теперь
LF> * хотим вывести на печать строку */
LF> printf(fmt, /* а вот сюда хочется подставить остальные аргументы, которые ... */);
LF> return (ret_val);
LF>}
LF>int main(int argc, char *argv[])
LF>{
LF> return trace_args("Arg1=%s, Arg2=%s, Arg3=%s", "Hello", "world", "!!!");
LF>}
LF>
смотри vprintf
и va_list
вообще то это FAQ
---
С уважением,
Сергей Мухин
Re: Как variadic arguments передать дальше в функцию?
Здравствуйте, Latent Force, Вы писали:
LF>Привет!
LF>Подскажите, плиз, а то совсем запутался. Дано GNU libc. Требуется написать функцию, в которую передается переменное число аргументов, и затем эти аргументы передаются целиком дальше, уже в другую функцию с переменным числом аргуметнов. Собственно как написать ф-цию с переменным числом аргументов не проблема, проблема в том как их подставить в точно такую же функцию.
LF>
LF>static int trace_args(char *fmt, ...)
LF>{
LF> int ret_val = 0;
LF> /* тут мы что-то поделали и теперь
LF> * хотим вывести на печать строку */
LF> printf(fmt, /* а вот сюда хочется подставить остальные аргументы, которые ... */);
LF> return (ret_val);
LF>}
LF>int main(int argc, char *argv[])
LF>{
LF> return trace_args("Arg1=%s, Arg2=%s, Arg3=%s", "Hello", "world", "!!!");
LF>}
LF>
man 3 vprintf
ну и сопутствующие функции тоже...
Re[2]: Как variadic arguments передать дальше в функцию?
> СМ>смотри vprintf > СМ>и va_list > > СМ>вообще то это FAQ > > Ну, хорошо, я тут привел не удачный пример с принтом, вопрос-то не в этом, пусть вместо этого printf будет другая аналогичная по декларации функция.
Задрали уже с этими троеточиями. Десяток-другой раз здесь это уже обсуждалось, все что можно — давно сказали.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Sergey, Вы писали:
S>Задрали уже с этими троеточиями. Десяток-другой раз здесь это уже обсуждалось, все что можно — давно сказали.
1. Задрали уже говорить задрали, только для того чтобы что-то сказать.
2. Перед тем как запостить поискал, что уже обсуждалось. В основном вопрос был в использовании этих параметров внутри вызова, что прекрасно изложено в мануале и в чем я не нуждался. Меня интересовало другое. Если я что-то и проглядел, то вместо вашего "задрали" можно было бы и носом ткнуть в ссылку, раз уж это так часто задают.
3. В мире вообще уже о многом говорили и не один десяток раз, так что же теперь никогда не разговаривать.
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re[5]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Latent Force, Вы писали:
LF>2. Перед тем как запостить поискал, что уже обсуждалось. В основном вопрос был в использовании этих параметров внутри вызова, что прекрасно изложено в мануале и в чем я не нуждался. Меня интересовало другое. Если я что-то и проглядел, то вместо вашего "задрали" можно было бы и носом ткнуть в ссылку, раз уж это так часто задают.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Нет у тебя стольких носов, чтобы каждым ткнуть.
Спасибо за ссылки
RO>Вот значительную часть этого многого можно выгуглить. А мудрый человек вообще говорит мало.
Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re[7]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Latent Force, Вы писали:
LF>Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?
Ну да, если человек не удосуживается нажать кнопку «Q&A» в верхнем углу, прежде чем спрашивать, то о чем с ним говорить.
До последнего не верил в пирамиду Лебедева.
Re[8]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Latent Force, Вы писали:
LF>>Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?
а ты встань около карты, на которой написано обычно "вы находитесь здесь" (в метро часто бывает), и поспрашивай. А потом догони, и снова спроси. а через три метра второй такой же будет стоять и спрашивать! а то что ты сравниваешь совсем не то!
---
С уважением,
Сергей Мухин
Re[7]: Как variadic arguments передать дальше в функцию?
> RO>Вот значительную часть этого многого можно выгуглить. А мудрый человек вообще говорит мало. > Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным.
Вот я и поговорил...
> Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него.
Если вы считаете, что мой ответ не соответствует правилам форума, обратитесь к модератору — вдруг он с этим согласится и забанит меня.
> Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом?
Не претендую на то, чтобы мои ответы считались мудрыми.
> Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт?
Потому что дорогу спрашивают редко и флейм на тему правильную ли указали дорогу не разводят.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Roman Odaisky, Вы писали: > Ну да, если человек не удосуживается нажать кнопку «Q&A» в верхнем углу, прежде чем спрашивать, то о чем с ним говорить.
А теперь, Роман, специально для вашей коллекции я вам скажу, что во всех этих ссылках, которые вы представили, даны ответы либо как использовать printf, что мне не нужно, я потом об этом написал, либо рекомендации завести внутреннюю функцию с va_list, что мне тоже не подходит, поскольку менять я эту ф-цию не могу. Но правдо в 2-3х постах откровенно сказано, что так сделать невозможно, что собственно и является ответом на поставленный мной вопрос.
Вот анализ вашей коллекции:
===========================
Переменное число аргументов функции — транзитом ---> Изменить вторую функцию. Вердикт: не подходит Функция с неизвестным числом аргументов ---> Использование vprintf. Вердикт: не по теме Ellipsis ---> Определение еще одной функции с va_list. Вердикт: не по теме Передача произвольного числа параметров из функции в функцию ---> Опять printf. Вердикт: не по теме Как передать (...) дальше ---> Уже ближе, но опять с переделкой внутренней ф-ции, либо макрос. Вердикт: нереализуемо Передача неопределённого списка параметров ---> Опять printf. Вердикт: не по теме Передача неограниченного количества аргументов дальше по стеку ---> Опять va_list, либо vprintf. Вердикт: не по теме Функции с переменным количеством параметров. Вопрос. ---> Опять va_list. Вердикт: не по теме Передача переменного числа параметров ---> Опять va_list. Вердикт: не по теме Как передать ( ... ) аргументы другой функции? ---> Опять va_list. Вердикт: не по теме Передача неопределённого числа аргументов ---> Опять va_list. Вердикт: не по теме как передать параметры <...> из первой функции во вторую? ---> Опять va_list. Вердикт: нереализуемо Variable number of arguments: delegation ---> Опять va_list. Вердикт: нереализуемо
Теперь в следующий раз вы сможете давать ссылки из коллекции согласно сути вопроса. Но, я вам все равно благодарен, без шуток
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re: Как variadic arguments передать дальше в функцию?
LF>Привет!
LF>... Требуется написать функцию, в которую передается переменное число аргументов, и затем эти аргументы передаются целиком дальше, уже в другую функцию с переменным числом аргуметнов.
В общем случае задача решения не имеет.
Обходные пути:
1. Использование других функций
2. Хаки с ручным запихиванием параметров в стек и вызовом функции через call
Да здравствует мыло душистое и веревка пушистая.
Re[9]: Как variadic arguments передать дальше в функцию?
Здравствуйте, Latent Force, Вы писали:
LF>... Вердикт: не по теме
Все по теме на самом деле — начав читать что там везде написано, ты сразу должен был проникнуться мыслью, что в том виде в которым ты это хочешь получить задача не имеет решения (без ассемблерных хаков — будешь заниматься?)
При этом обрати внимание — начальные вопросы большинства этих тем звучат в точности как твой — и уж тут не догадаться что все ответы на подобные вопросы свелись к va_list отнюдь неспроста, согласись, несколько ... ммм ....
А для буквоедов аля "по теме / не по теме" вот ответ "по теме":
LF>как их подставить в точно такую же функцию.
Никак
// ...
подпись
Re: Как variadic arguments передать дальше в функцию?
От:
Аноним
Дата:
21.12.07 00:11
Оценка:
Здравствуйте, Latent Force, Вы писали:
LF>Подскажите, плиз, а то совсем запутался. Дано GNU libc. Требуется написать функцию, в которую передается переменное число аргументов, и затем эти аргументы передаются целиком дальше, уже в другую функцию с переменным числом аргуметнов. Собственно как написать ф-цию с переменным числом аргументов не проблема, проблема в том как их подставить в точно такую же функцию.
...
LF> printf(fmt, /* а вот сюда хочется подставить остальные аргументы, которые ... */);
...
Вот тебе 3 варианта, а то тебя ссылками завалят нафиг:
#include <stdio.h>
#include <stdarg.h>
// 1. как надо void vfn(const char* fmt,va_list v) { // собственно обработчик
ptrinf("fn: ");
vprintf(fmt,v);
}
void fn(const char* fmt,...) { // обычно делают так. и обычно всегда inline
va_list v;va_start(v,fmt);
vfn(fmt,v);
va_end(v); // эту строчку можно не писать
}
// 2. просто замена имени #define fn_redir1 fn
// 3. варварский способstruct VA_REDIR {
void *p0, *ra, *fn;
//
// extern "C" void va_jmp(VA_REDIR *v); // cpu & platform dependant
//
// [ASM.i386]
// _va_jmp:
// 58 pop eax
// FF30 push dword ptr [eax] // p0
// FF7004 push dword ptr [eax+4] // ra
// FF7008 push dword ptr [eax+8] // fn
// C3 retn // doit
//
VA_REDIR(void*volatile* p,void *fn):p0(p[0]),ra(p[-1]),fn(fn) {
static char va_jmp[]={ 0x58, 0xFF,0x30, 0xFF,0x70,0x04, 0xFF,0x70,0x08, 0xC3 }; // i386 only!
p[0]=this;p[-1]=va_jmp;
}
};
#define VA_REDIRECT(p0,fn) if(0){}else{volatile VA_REDIR tmp((void*volatile*)&p0,(void*)&fn); return;}
void fn_redir2(const char* fmt,...) { VA_REDIRECT(fmt,fn); }
// примерint main(int narg,char** argv) {
fn("use va_list %d %d %.2f\n",1,2,3.45);
fn_redir1("simple rename %d %d %.2f\n",1,2,3.45);
fn_redir2("try to avoid this %d %d %.2f\n",1,2,3.45);
return 0;
}
3-тий вариант хоть и работает, но очень не рекомендую