Форум программистов, компьютерный форум CyberForum.ru

Функции с переменным числом аргументов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.62
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
10.08.2010, 11:19     Функции с переменным числом аргументов #1
на пример sum(2,56,515,-23.65,548)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.08.2010, 12:05     Функции с переменным числом аргументов #2
nikkka, можно. Яркий пример - функции printf, scanf

Добавлено через 1 минуту
Вот так оно реализуется в С++

Добавлено через 35 минут
А с приходом стандарта С++0x нас ожидают еще и шаблоны с переменным числом аргументов
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
10.08.2010, 12:18  [ТС]     Функции с переменным числом аргументов #3
Цитата Сообщение от Nameless One Посмотреть сообщение
шаблоны с переменным числом аргументов
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
10.08.2010, 14:19     Функции с переменным числом аргументов #4
nikkka, если данные однотипные, то можно передавать указатель на массив
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
10.08.2010, 14:53     Функции с переменным числом аргументов #5
Только это правильно называется с "переменным числом аргументов". Есть ещё и научное название - "эллипс" (ellipsis). Слэнговое название "три точки" (threedot)

Пример есть тут. Но он несколько корявый, в том плане, что все аргументы одного и того же типа
http://www.cplusplus.com/reference/c...stdarg/va_arg/

Модешь по форуму поискать с ключевым словом "va_arg"
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
10.08.2010, 22:02     Функции с переменным числом аргументов #6
Цитата Сообщение от Evg Посмотреть сообщение
Есть ещё и научное название - "эллипс" (ellipsis).
Научное название "эллипсис", как и указано в скобках.
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
10.08.2010, 22:13  [ТС]     Функции с переменным числом аргументов #7
то есть ""элипсис""?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
10.08.2010, 23:09     Функции с переменным числом аргументов #8
Цитата Сообщение от nikkka Посмотреть сообщение
то есть ""элипсис""?
Существуют функции, в описании которых невозможно указать число и типы всех допустимых параметров. Тогда список формальных параметров завершается эллипсисом (...), что означает: "и, возможно, еще несколько аргументов".
Страуструп
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
11.08.2010, 18:11     Функции с переменным числом аргументов #9
В книге(справочнике) "Язык программирования C"(авторы Харбисон и Стил) было про это написано если найду напишу...

Добавлено через 1 час 14 минут
Нашёл в разделе "Стандертные дополнения языка"!!!
Но переписывать 3 страници неохото
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2010, 18:19     Функции с переменным числом аргументов #10
Цитато из Шилдта:

В программе можно объявить функцию с переменным колличеством параметров. В большинстве случаев это относится к функции printf(). Чтобы сообщить компилятору, что функция может быть вызвана с разным колличеством параметров, объявление ее параметров следует завершить многоточием. Например, прототип, приведенный ниже означает, что функция func() может иметь по меньшей мере 2 параметра и сколько угодно доп параметров, или не иметь их.

C++
1
int func(int a, int b, ...);
Этот способ объявления параметров используется и в определении функции.
Любая функция с переменным колличеством параметров должна иметь по меньшей мере один фактический параметр. Следующее объявление неверно.

C++
1
int func(...) //Неверно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
11.08.2010, 19:43     Функции с переменным числом аргументов #11
Цитата Сообщение от Lavroff Посмотреть сообщение
Следующее объявление неверно
А в Си++ такое разрешено вроде бы как. g++ по крайней мере это ест
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2010, 19:45     Функции с переменным числом аргументов #12
Evg, Ну да. Это возможно) Просто это раздел Шилдта еще про Си)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
11.08.2010, 20:20     Функции с переменным числом аргументов #13
Цитата Сообщение от Lavroff Посмотреть сообщение
Evg, Ну да. Это возможно) Просто это раздел Шилдта еще про Си)
Ну и вопрос на засыпку, а как этим в Си++ пользоваться? Имею в виду, когда ни одного именованного аргумента. У меня соображений нет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2010, 20:22     Функции с переменным числом аргументов #14
Evg, Да я как-то пытался... Но что-то никак. Наверное потому что, я в этом не разбираюсь, и мне это особо пока не нужно.
А это вообще может использоваться? Может просто компиль нормально на это реагирует?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
11.08.2010, 20:27     Функции с переменным числом аргументов #15
Цитата Сообщение от Lavroff Посмотреть сообщение
А это вообще может использоваться? Может просто компиль нормально на это реагирует?
Компилятор это ест (по крайней мере g++ и borland), так что скорее всего это из стандарта Си++. Как это может использоваться - не знаю. Хотелось бы узнать. Чтобы в очередной раз высказать "фи" в сторону Си++
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2010, 20:37     Функции с переменным числом аргументов #16
Evg, Букв много. Но вроде то что надо
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
11.08.2010, 21:17     Функции с переменным числом аргументов #17
Цитата Сообщение от Lavroff Посмотреть сообщение
Могу ответственно заявить, что автор статьи - дятел. В том плане, что эллиптические аргументы должны доставаться совсем не так, как он написал, а через интерфейсы va_arg (из stdarg.h)

Новичкам показывать эту статью строго запрещается. Понятно, что если человек всю жизнь будет работать только на intel'овской архитектуре, может быть так и можно делать, но ведь заранее никому неизвестно, как будут меняться программные соглашения по передаче параметров в будущих intel'овских процессорах. Да и незачем приучать людей к неправильным вещам
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
11.08.2010, 21:28     Функции с переменным числом аргументов #18
Вот рабочий пример функции sum(int,...):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
 
/* Будет складывать k аргументов после k */
int sum1(int k,...)
{
  va_list ap;
  int s = 0;
  va_start( ap, k );
  while( k-- > 0 )
    s += va_arg( ap, int );
  va_end(ap);
  return s;
}
 
/* Будет складывать аргументы пока невстретится 0(ноль) */
int sum2(int onearg,...)
{
  va_list ap;
  int s = onearg;
  int n;
  va_start( ap, onearg );
  while( n = va_arg( ap, int ) )
    s += n;
  va_end(ap);
  return s;
}
 
int main(int argc, char *argv[])
{
  int s1 = sum1( 10/*Г*ðãóìåГ*òîâ*/, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 );
  int s2 = sum2( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0/*ГЄГ®Г*ГҐГ¶*/ );
  printf( "s1 = %d; s2 = %d;\n", s1, s2 );
  system("PAUSE");
  return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2010, 21:30     Функции с переменным числом аргументов #19
Evg, Суть в том, что использовать такую функцию

int foo(...) - нереально. Ибо нету конечного значения никакого. Следовательно не возможно сие сделать. Несмотря на то, что компилятор на это не ругается.

И да. Как уже писали здесь в С++0x для этого будет предназначены шаблоны с переменным числом параметров
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2010, 21:33     Функции с переменным числом аргументов
Еще ссылки по теме:

C++ Как изменить значение переменной, переданной в списке с переменным числом аргументов
C++ GCC и функции с переменным числом аргументов
Функции с переменным числом параметров C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
11.08.2010, 21:33     Функции с переменным числом аргументов #20
Цитата Сообщение от Lavroff Посмотреть сообщение
Evg, Суть в том, что использовать такую функцию
int foo(...) - нереально
Именно поэтому мне хочется высказать "Фи" в адрес разработчиков Си++. Либо всё-таки какая-то потаённая возможность есть. Либо закладывались на такие архитектурно-зависимые случаи.
Yandex
Объявления
11.08.2010, 21:33     Функции с переменным числом аргументов
Ответ Создать тему
Опции темы

Текущее время: 04:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru