Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=603904&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Mon Apr 11 22:55:56 2016
Кодировка: Windows-1251
Variable Number of Arguments (C/C++) - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
General Discussion >> Study (Archive)

Страницы: 0 | 20 | показать все | след. страница
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'е написано не внятно)



тел: +7(926)5585879 icq: 169182107 email: patnic@mail.ru private: message
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
 

Quote:

C/C++ Illustrated







тел: +7(926)5585879 icq: 169182107 email: patnic@mail.ru private: message
Anonymous
Незарегистрирован
(172.16.13.73)

  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.

Anonymous
Незарегистрирован
(10.3.0.243)

  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 в данном примере) не катит




тел: +7(926)5585879 icq: 169182107 email: patnic@mail.ru private: message
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 (или как там его)?



тел: +7(926)5585879 icq: 169182107 email: patnic@mail.ru private: message
Anonymous
Незарегистрирован
(172.16.13.73)

  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))++)
вот это меня и пугает




тел: +7(926)5585879 icq: 169182107 email: patnic@mail.ru private: message
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!
Страницы: 0 | 20 | показать все | след. страница

General Discussion >> Study (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  Basilio, The_Nameless_One 

Печать темы
>>
Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в