Variable number of arguments: delegation
От: Ушастый Ёж Великобритания  
Дата: 19.10.07 01:09
Оценка:
Как передать все параметры из функции bar в функцию foo? Изменить сигнатуру функции foo нельзя.

void foo(char* args, ...);

void bar(char* args, ...)
{
    ...
    foo( ??? );
    ...
}
Re: Variable number of arguments: delegation
От: dip_2000 Россия  
Дата: 19.10.07 05:05
Оценка: -1
Здравствуйте, Ушастый Ёж, Вы писали:

УЁ>Как передать все параметры из функции bar в функцию foo? Изменить сигнатуру функции foo нельзя.


УЁ>
УЁ>void foo(char* args, ...);

УЁ>void bar(char* args, ...)
УЁ>{
УЁ>    ...
УЁ>    foo( ??? );
УЁ>    ...
УЁ>}
УЁ>


100% не дам, но имхо читать документацию по следующим функциям

 
type va_arg(
      va_list arg_ptr,
      type 
);
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr 
);  // (UNIX version)
void va_start(
   va_list arg_ptr,
      prev_param 
); // (ANSI version)


и получится нечто вроде :

void foo(char* args, ...);

void bar(char* args, ...)
{
    ...
va_list arglist;
va_start(arglist, format);
    foo( arglist );
va_end(arglist);
    ...
}

Код написан на коленке, с явным нежеланием читать документацию, но что-то похоее должно быть, имхо
Re[2]: Variable number of arguments: delegation
От: _Obelisk_ Россия http://www.ibm.com
Дата: 19.10.07 05:22
Оценка: +1
Здравствуйте, dip_2000, Вы писали:

_>и получится нечто вроде :


_>
_>void foo(char* args, ...);

_>void bar(char* args, ...)
_>{
_>    ...
_>va_list arglist;
_>va_start(arglist, format);
_>    foo( arglist );
_>va_end(arglist);
_>    ...
_>}
_>

_>Код написан на коленке, с явным нежеланием читать документацию, но что-то похоее должно быть, имхо

Не получится, ибо стэк будет другой.
Необходима версия функции foo() в виде

void foo(char* args, va_list argList);


http://www.rsdn.org:80/File/18435/5278.png
Душа обязана трудиться! (с) Н.Заболоцкий.
Re[3]: Variable number of arguments: delegation
От: dip_2000 Россия  
Дата: 19.10.07 05:24
Оценка: -1
Здравствуйте, _Obelisk_, Вы писали:

_O_>Не получится, ибо стэк будет другой.

_O_>Необходима версия функции foo() в виде

_O_>
_O_>void foo(char* args, va_list argList);
_O_>


рискну предположить что нужна не foo(), а bar() с такой сигнатурой. А это под условие задачи подходит вобщем то...
С foo() точно все ок.
Re: Variable number of arguments: delegation
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.10.07 08:06
Оценка: -1
Здравствуйте, Ушастый Ёж, Вы писали:

УЁ>Как передать все параметры из функции bar в функцию foo? Изменить сигнатуру функции foo нельзя.


УЁ>
УЁ>void foo(char* args, ...);

УЁ>void bar(char* args, ...)
УЁ>{
УЁ>    ...
УЁ>    foo( ??? );
УЁ>    ...
УЁ>}
УЁ>


Если вызов foo идет в конце bar, можно решить так:
void bar(char* args, ...)
{
    ...
    _asm jmp foo;
}

Конечно, это решение непортабельно.

По-другому, требуется изменение сигнатуры foo
Re[2]: Variable number of arguments: delegation
От: dip_2000 Россия  
Дата: 22.10.07 08:14
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>
ROP>Если вызов foo идет в конце bar, можно решить так:
ROP>void bar(char* args, ...)
ROP>{
ROP>    ...
ROP>    _asm jmp foo;
ROP>}
ROP>

ROP>Конечно, это решение непортабельно.
Решение не только не портабельно, но и не имеет отношения к разделу в котором был задан вопрос
Re[3]: Variable number of arguments: delegation
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.10.07 08:33
Оценка:
Здравствуйте, dip_2000, Вы писали:

ROP>>Конечно, это решение непортабельно.

_>Решение не только не портабельно, но и не имеет отношения к разделу в котором был задан вопрос
Пусть, но другого решения задача не имеет (в том виде в каком она поставлена).
Если не согласен — код в студию.
Re[2]: Variable number of arguments: delegation
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.10.07 09:09
Оценка:
Здравствуйте, dip_2000, Вы писали:


_>и получится нечто вроде :


_>
_>void foo(char* args, ...);

_>void bar(char* args, ...)
_>{
_>    ...
_>va_list arglist;
_>va_start(arglist, format);
_>    foo( arglist );
_>va_end(arglist);
_>    ...
_>}
_>

_>Код написан на коленке, с явным нежеланием читать документацию, но что-то похоее должно быть, имхо

foo( arglist );
кладет в стек указатель на "массив" аргументов.
Сигнатура foo требует передачи этого "массива" по значению.
Слушайте радио RT FM.

Переменное число аргументов не так просто в стек положить.

Прошу снять минусы.
Как передать параметры <...> из первой функции во вторую?
От: Roman Odaisky Украина  
Дата: 22.10.07 11:28
Оценка: 15 (1) +1 :)
#Имя: FAQ.cpp.args.ellipsis
Здравствуйте, Ушастый Ёж, Вы писали:

УЁ>Как передать все параметры из функции bar в функцию foo? Изменить сигнатуру функции foo нельзя.


Я собираю коллекцию.

Переменное число аргументов функции &mdash; транзитом
Автор: 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

как передать параметры &lt;...&gt; из первой ф-ии во вторую?
Автор: Tubrik
Дата: 04.10.07
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.