Re[5]: Как variadic arguments передать дальше в функцию?
От: Roman Odaisky Украина  
Дата: 18.12.07 17:44
Оценка: 2 (2) +1 :)
Здравствуйте, Latent Force, Вы писали:

LF>2. Перед тем как запостить поискал, что уже обсуждалось. В основном вопрос был в использовании этих параметров внутри вызова, что прекрасно изложено в мануале и в чем я не нуждался. Меня интересовало другое. Если я что-то и проглядел, то вместо вашего "задрали" можно было бы и носом ткнуть в ссылку, раз уж это так часто задают.


Нет у тебя стольких носов, чтобы каждым ткнуть.

Переменное число аргументов функции — транзитом
Автор: mihoshi
Дата: 14.01.03

Функция с неизвестным числом аргументов
Автор: KPavel
Дата: 23.05.03

Ellipsis
Автор: 0xFADE
Дата: 07.06.04

Передача произвольного числа параметров из функции в функцию
Автор: Basil2
Дата: 27.07.04

Как передать (...) дальше
Автор:
Дата: 10.12.04

Передача неопределённого списка параметров
Автор: King of a Stellar War
Дата: 08.01.05

Передача неограниченного количества аргументов дальше по стеку
Автор: Dan_Mor
Дата: 09.09.05

Функции с переменным количеством параметров. Вопрос.
Автор: Aractan
Дата: 08.02.06

Передача переменного числа параметров
Автор:
Дата: 16.03.06

Как передать ( ... ) аргументы другой функции?
Автор: Andrew S.
Дата: 31.08.06

Передача неопределённого числа аргументов
Автор: Tilir
Дата: 07.10.06

как передать параметры <...> из первой функции во вторую?
Автор: Tubrik
Дата: 04.10.07

Variable number of arguments: delegation
Автор: Ушастый Ёж
Дата: 19.10.07


LF>3. В мире вообще уже о многом говорили и не один десяток раз, так что же теперь никогда не разговаривать.


Вот значительную часть этого многого можно выгуглить. А мудрый человек вообще говорит мало.
До последнего не верил в пирамиду Лебедева.
Re[6]: Как variadic arguments передать дальше в функцию?
От: Latent Force  
Дата: 19.12.07 14:15
Оценка: 1 (1) +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Нет у тебя стольких носов, чтобы каждым ткнуть.

Спасибо за ссылки


RO>Вот значительную часть этого многого можно выгуглить. А мудрый человек вообще говорит мало.

Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re[3]: Как variadic arguments передать дальше в функцию?
От: Sergey Россия  
Дата: 18.12.07 14:25
Оценка: +1
> СМ>смотри vprintf
> СМ>и va_list
>
> СМ>вообще то это FAQ
>
> Ну, хорошо, я тут привел не удачный пример с принтом, вопрос-то не в этом, пусть вместо этого printf будет другая аналогичная по декларации функция.

Задрали уже с этими троеточиями. Десяток-другой раз здесь это уже обсуждалось, все что можно — давно сказали.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[9]: Как variadic arguments передать дальше в функцию?
От: Max M. Ниоткуда  
Дата: 20.12.07 17:31
Оценка: +1
Здравствуйте, Latent Force, Вы писали:

LF>... Вердикт: не по теме


Все по теме на самом деле — начав читать что там везде написано, ты сразу должен был проникнуться мыслью, что в том виде в которым ты это хочешь получить задача не имеет решения (без ассемблерных хаков — будешь заниматься?)
При этом обрати внимание — начальные вопросы большинства этих тем звучат в точности как твой — и уж тут не догадаться что все ответы на подобные вопросы свелись к va_list отнюдь неспроста, согласись, несколько ... ммм ....

А для буквоедов аля "по теме / не по теме" вот ответ "по теме":

LF>как их подставить в точно такую же функцию.


Никак
// ...
подпись
Как variadic arguments передать дальше в функцию?
От: Latent Force  
Дата: 18.12.07 12:55
Оценка:
Привет!

Подскажите, плиз, а то совсем запутался. Дано 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 передать дальше в функцию?
От: Сергей Мухин Россия  
Дата: 18.12.07 13:01
Оценка:
Здравствуйте, 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 передать дальше в функцию?
От: zaufi Земля  
Дата: 18.12.07 13:02
Оценка:
Здравствуйте, 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 передать дальше в функцию?
От: Latent Force  
Дата: 18.12.07 13:28
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>смотри vprintf

СМ>и va_list

СМ>вообще то это FAQ


Ну, хорошо, я тут привел не удачный пример с принтом, вопрос-то не в этом, пусть вместо этого printf будет другая аналогичная по декларации функция.
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re[4]: Как variadic arguments передать дальше в функцию?
От: Latent Force  
Дата: 18.12.07 17:01
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Задрали уже с этими троеточиями. Десяток-другой раз здесь это уже обсуждалось, все что можно — давно сказали.


1. Задрали уже говорить задрали, только для того чтобы что-то сказать.
2. Перед тем как запостить поискал, что уже обсуждалось. В основном вопрос был в использовании этих параметров внутри вызова, что прекрасно изложено в мануале и в чем я не нуждался. Меня интересовало другое. Если я что-то и проглядел, то вместо вашего "задрали" можно было бы и носом ткнуть в ссылку, раз уж это так часто задают.
3. В мире вообще уже о многом говорили и не один десяток раз, так что же теперь никогда не разговаривать.
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
Re[7]: Как variadic arguments передать дальше в функцию?
От: Roman Odaisky Украина  
Дата: 19.12.07 14:50
Оценка:
Здравствуйте, Latent Force, Вы писали:

LF>Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?


Ну да, если человек не удосуживается нажать кнопку «Q&A» в верхнем углу, прежде чем спрашивать, то о чем с ним говорить.
До последнего не верил в пирамиду Лебедева.
Re[8]: Как variadic arguments передать дальше в функцию?
От: Сергей Мухин Россия  
Дата: 19.12.07 14:53
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Latent Force, Вы писали:


LF>>Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным. Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него. Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом? Я ни к кому навязчиво не приставал, и не кричал, что на форуме все козлы, потому что никто не может ответить на мой вопрос. Ответят — спасибо большое, нет — ну докапаюсь сам. Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт? Это что теперь мода такая?


а ты встань около карты, на которой написано обычно "вы находитесь здесь" (в метро часто бывает), и поспрашивай. А потом догони, и снова спроси. а через три метра второй такой же будет стоять и спрашивать! а то что ты сравниваешь совсем не то!
---
С уважением,
Сергей Мухин
Re[7]: Как variadic arguments передать дальше в функцию?
От: Sergey Россия  
Дата: 19.12.07 14:56
Оценка:
> RO>Вот значительную часть этого многого можно выгуглить. А мудрый человек вообще говорит мало.
> Человек существо общественное, и поэтому поговорить о чем-нибудь не считается зазорным.

Вот я и поговорил...

> Я просто спросил, кто-нибудь бы просто ответил, а если кто-то посчитал бы это за тупой вопрос, который миллион раз обсуждался, то что стоит просто не отвечать на него.


Если вы считаете, что мой ответ не соответствует правилам форума, обратитесь к модератору — вдруг он с этим согласится и забанит меня.

> Или сказать, что его уже задолбали такие вопросы считается теперь мудрым ответом?


Не претендую на то, чтобы мои ответы считались мудрыми.

> Почему когда спрашивают дорогу, все охотно отвечают, а не говорят, что как его задолбало, и что уже нарисовано тысячи карт?


Потому что дорогу спрашивают редко и флейм на тему правильную ли указали дорогу не разводят.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Как variadic arguments передать дальше в функцию?
От: Latent Force  
Дата: 20.12.07 12:26
Оценка:
Здравствуйте, 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 передать дальше в функцию?
От: Vamp Россия  
Дата: 20.12.07 14:10
Оценка:
LF>Привет!

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


В общем случае задача решения не имеет.
Обходные пути:
1. Использование других функций
2. Хаки с ручным запихиванием параметров в стек и вызовом функции через call
Да здравствует мыло душистое и веревка пушистая.
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-тий вариант хоть и работает, но очень не рекомендую
Re: Всем спасибо.
От: Latent Force  
Дата: 24.12.07 12:30
Оценка:
Всем откликнувшимся спасибо!
Тема закрыта.
----------------------
Одно из свойств человеческого ума состоит в том, что, сталкиваясь с противоречием, он не может оставаться пассивным.
Э. Фромм.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.