|
patnic
|
|
baron
|
|
|
|
|
|
|
Рег.: 02.11.2002
|
|
Сообщений: -666
|
|
|
|
Рейтинг: 1183
|
|
Variable Number of Arguments (C/C++)
02.11.2003 08:20
|
|
|
есть функция (ну пусть для примера среднее), которая вызывается с разным числом параметров, как их получать я знаю, вопрос в том как определить внутри функции сколько аргументов она получила?
avg(int num_of_args, ...) не катит, чтобы не было случаев avg(9999). делать последний аргумент каким-то magic_number'ом - тоже нельзя.
для чего нужно va_end (в msdn'е написано не внятно)
|
|
|
|
Coldate
|
|
enthusiast
|
|
|
|
|
|
|
Рег.: 23.09.2003
|
|
Сообщений: 230
|
|
Из: USA
|
|
Рейтинг: 0
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
02.11.2003 09:44
|
|
|
>в msdn'е написано не внятно
А где тогда внятно? "C/C++ Illustrated"? 
Редактировал Coldate (02.11.2003 09:44)
|
+++
Я бы за такое тоже банил... |
|
|
patnic
|
|
baron
|
|
|
|
|
|
|
Рег.: 02.11.2002
|
|
Сообщений: -666
|
|
|
|
Рейтинг: 1183
|
|
Re: Variable Number of Arguments (C/C++)
[re: Coldate]
02.11.2003 09:55
|
|
|
|
|
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
02.11.2003 12:00
|
|
|
Чего-то я не понял, чем тебя число аргументов в параметрах не устраивает. Тебя же printf не напрягает использовать.
|
|
|
KOHTPA
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 22.01.2003
|
|
Сообщений: 33647
|
|
|
|
Рейтинг: 2374
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
02.11.2003 12:31
|
|
|
Ответ: никак.
Только передав явно или неявно, как в printf, самому.
Посмотри, как сделан va_end в заголовочнике. Почти наверняка, это макрос.
--- ...Я работаю антинаучным аферистом...
|
|
|
yanys
|
|
Доктор Кот
|
|
|
|
|
|
|
Рег.: 08.10.2003
|
|
Сообщений: 2098
|
|
|
|
Рейтинг: 1394
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
02.11.2003 18:18
|
|
|
Стандартный путь определения количества переданных аргументов описан в MSDN. Используем макросы va_start, va_arg и va_end. Дальше цитата code: int average( int first, ... ) { int count = 0, sum = 0, i = first; va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */ while( i != -1 ) { sum += i; count++; i = va_arg( marker, int); } va_end( marker ); /* Reset variable arguments. */ return( sum ? (sum / count) : 0 ); }
То есть надо пробежаться по списку аргументов, инкрементируя счетчик, пока va_arg() не вернет -1. Я так понял Вам не понравилось, что нет способа получить число аргументов одним вызовом? Ну и пускай нет. Все равно, как правило, переданные аргументы нужны. Вот и тащите их в цикле, как выше, подсчитывая, сколько вытащили. Для чего нужен макрос va_end. В MSDN написано: Quote:
After all arguments have been retrieved, va_end resets the pointer to NULL.
. То есть это делается только для того, чтобы показать, что все, мы закончили работать со списком аргументов. Если Вы потом, "ниже по течению" кода, забудете про это и попытаетесь чего-то делать с va_list, программа Вам тут же освежит память. То есть va_end можно в конце работы со списком параметров не вызывать. Будет работать. Можно залезть в файл VC98\CRT\SRC\stdarg.h и посмотреть, как определены макросы va_start, va_arg и va_end для разных платформ. Например для платформы intel x86 будет: code:
#ifdef _M_IX86 #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 ) /* <= вот он, красавчик, ничего особенного не делает */
|
Get your facts first, and then you can distort them as much as you please. Mark Twain
|
|
|
Shurick
|
|
Bad Man
|
|
|
|
|
|
|
Рег.: 30.08.2002
|
|
Сообщений: 6379
|
|
|
|
Рейтинг: 303
|
|
Re: Variable Number of Arguments (C/C++)
[re: yanys]
02.11.2003 18:56
|
|
|
> надо пробежаться по списку аргументов, инкрементируя счетчик, пока va_arg() не вернет -1 > #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
че-та не вижу связи 1) сомневаюсь, что компилер кладет (int)-1 в конец списка аргументов 2) как быть, если мне нужно -1 передать?
|
|
|
DarkGray
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 30.09.2002
|
|
Сообщений: 31404
|
|
|
|
Рейтинг: 8950
|
|
Re: Variable Number of Arguments (C/C++)
[re: yanys]
02.11.2003 19:08
|
|
|
> То есть надо пробежаться по списку аргументов, инкрементируя счетчик, пока va_arg() не вернет -1
Это уже домыслы, -1 будет только для данного примера. В других случаях будет что-то свое.
|
|
|
DarkGray
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 30.09.2002
|
|
Сообщений: 31404
|
|
|
|
Рейтинг: 8950
|
|
Re: Variable Number of Arguments (C/C++)
[re: Shurick]
02.11.2003 19:11
|
|
|
-1 это только для приведенного примера.
В приведенном примере, функция average всегда должна вызыватся следующим образом: average (10, 20, 3, 465, -1) , т.е. последовательность чисел всегда должна заканчиватся -1.
|
|
|
|
Re: Variable Number of Arguments (C/C++)
[re: DarkGray]
02.11.2003 19:21
|
|
|
Дааа." Поспешишь, людей насмешишь" (С). Неправду сказал. Облажался. Стыжусь. Полностью согласен с Shurick и DarkGrey.
|
|
|
yanys
|
|
Доктор Кот
|
|
|
|
|
|
|
Рег.: 08.10.2003
|
|
Сообщений: 2098
|
|
|
|
Рейтинг: 1394
|
|
Re: Variable Number of Arguments (C/C++)
[re: Anonymous]
02.11.2003 19:22
|
|
|
Предыдущий пост от меня.
|
Get your facts first, and then you can distort them as much as you please. Mark Twain
|
|
|
patnic
|
|
baron
|
|
|
|
|
|
|
Рег.: 02.11.2002
|
|
Сообщений: -666
|
|
|
|
Рейтинг: 1183
|
|
Re: Variable Number of Arguments (C/C++)
[re: yanys]
03.11.2003 00:46
|
|
|
Quote:
Стандартный путь определения количества переданных аргументов описан в MSDN
я же говорил что magic number (-1 в данном примере) не катит
|
|
|
|
patnic
|
|
baron
|
|
|
|
|
|
|
Рег.: 02.11.2002
|
|
Сообщений: -666
|
|
|
|
Рейтинг: 1183
|
|
Re: Variable Number of Arguments (C/C++)
[re: KOHTPA]
03.11.2003 00:50
|
|
|
Quote:
Только передав явно или неявно, как в printf, самому.
пусть первый аргумент - число параметров, и я вызову avg(9999). все пройдет нормально или, будет access violation (или как там его)?
|
|
|
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
03.11.2003 00:57
|
|
|
В общем случае - нет. Если аргументов не слишком много, иначе ты дойдешь до начала стека и тогда с высокой вероятностью будет ошибка. Неужели ты никогда не путал у printf'а количество аргументов?
|
|
|
KOHTPA
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 22.01.2003
|
|
Сообщений: 33647
|
|
|
|
Рейтинг: 2374
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
03.11.2003 00:58
|
|
|
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\ /* stdarg.h
Definitions for accessing parameters in functions that accept a variable number of arguments.
Copyright (c) Borland International 1987,1988 All Rights Reserved. */ #if __STDC__ #define _Cdecl #else #define _Cdecl cdecl #endif
#if !defined(__STDARG) #define __STDARG
typedef void *va_list;
#define va_start(ap, parmN) (ap = ...) #define va_arg(ap, type) (*((type *)(ap))++) #define va_end(ap) #define _va_ptr (...) #endif /^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
Отсюда видно, как осуществлять доступ к параметрам.
Примерно то же, но чуть другое в GNU LibC. Различия не помню, но помню, что есть и очень маленькое (латал гнутые исходники).
--- "Vyroba umelych lidi, slecno, je tovarni tajemstvi." Karel Capek
|
|
|
patnic
|
|
baron
|
|
|
|
|
|
|
Рег.: 02.11.2002
|
|
Сообщений: -666
|
|
|
|
Рейтинг: 1183
|
|
Re: Variable Number of Arguments (C/C++)
[re: KOHTPA]
03.11.2003 01:05
|
|
|
>#define va_arg(ap, type) (*((type *)(ap))++) вот это меня и пугает 
|
|
|
|
KOHTPA
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 22.01.2003
|
|
Сообщений: 33647
|
|
|
|
Рейтинг: 2374
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
03.11.2003 01:09
|
|
|
А ты не бойся.
Гнусь выглядит СТРАШНЕЕ!!! Ж: ( )
--- ...Если ты не параноик, это еще не значит, что за тобой не следят...
|
|
|
Korvin
|
|
Carpal Tunnel
|
|
|
|
|
|
|
Рег.: 29.08.2002
|
|
Сообщений: 7777
|
|
|
|
Рейтинг: 0
|
|
Re: Variable Number of Arguments (C/C++)
[re: patnic]
03.11.2003 01:35
|
|
|
зачем это может быть нужно, коль уж ты слово С++ пишешь? наверняка есть более "правильный" способ, а то и не один
|
плз, ссылки не давайте, у меня инет гольфа (с) AVACADA |
|
|
Attila
|
|
R
|
|
|
|
|
|
|
Рег.: 18.12.2002
|
|
Сообщений: 16118
|
|
Из: ...вот именно там.
|
|
Рейтинг: 3169
|
|
Re: Variable Number of Arguments (C/C++)
[re: Korvin]
03.11.2003 10:27
|
|
|
наверняка... например, перегрузка запятой... что-то типа такого:
Average<int> a; a=1, 2, 3, 10, 20; cout << a << endl;
|
Кр-ть - с.т.! |
|
|
Nine17
|
|
Furia Roja
|
|
|
|
|
|
|
Рег.: 26.06.2003
|
|
Сообщений: 25543
|
|
|
|
Рейтинг: 13160
|
|
Re: Variable Number of Arguments (C/C++)
[re: Attila]
03.11.2003 14:19
|
|
|
Запятую нельзя перегружать
Но можно сделать типа
List<int> nill; f(nill << 10 << 20 << 30 << 40); Только зачем так извращаться?
|
Entre flores fandanguillos y alegria nació España mi tierra de amor! |
|