Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 11:59   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Как узнать переменное число параметров

Доброго времени суток. Возник один вопрос.
Есть функция с переменным числом параметров. Данные параметры есть неотрицательные числа для массива. Как сделать так, чтобы дойдя до конца списка (но не до конца массива), массив заполнился еденичками.
Навоял такую штуку.
Код:
void fillUp(int i,...)
{
	va_list ap;
	va_start(ap,i);
	data[0] = i;
	for(int j=1; j<size; j++)
	{
		if (ap != NULL)
		{
			data[j] = va_arg(ap,int);
			if (data[j] < 1)
			{
				ap = NULL;
				data[j] = 1;
			}
		} else
		{
			data[j] = 1;
		}
	}
	va_end(ap);
}
Заметил такую тенденцию: по завершению списка параметров, следующие два значения, выдаваемые va_arg(ap,int), нули. Теперь вопрос: если объект va_list - это стек, то почему он не завершается NULL? И как сделать эту функцию нормально)))?
P.S. Передавать в функцию число параметров - не желательно, равно как и завершать список маркером.
P.P.S. Пишу на C++
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.06.2009, 12:08   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

не использовал никогда переменное число параметров, но
Цитата:
Как сделать так, чтобы дойдя до конца списка (но не до конца массива), массив заполнился еденичками.
в начале функции напиши
memset(arr, 1, sizeof(arr));
дальше заполняй свой массив как надо
vvviperrr вне форума Ответить с цитированием
Старый 19.06.2009, 12:27   #3
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от vvviperrr Посмотреть сообщение
не использовал никогда переменное число параметров, но

в начале функции напиши
memset(arr, 1, sizeof(arr));
дальше заполняй свой массив как надо
Это понятно. Он по умолчанию еденицами заполнен. Проблемма в том, что невозможно определить когда параметры завершились.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.06.2009, 13:34   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 19.06.2009, 13:47   #5
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Если не ошибаюсь, то узнать число параметров нельзя. И нужно пользоваться маркером. По крайней мере, когда я использовал это, то не смог найти способа.
А почему по завершению списка параметров, следующие два значения, выдаваемые va_arg(ap,int), нули? Или это мне просто так везет?
И кстати: числа всегда одинаковые. Может я залажу в чужую область?
Искусственный интеллект - фигня по сравнению с естественной глупостью

Последний раз редактировалось Impuls1989; 19.06.2009 в 13:49.
Impuls1989 вне форума Ответить с цитированием
Старый 19.06.2009, 13:48   #6
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Цитата:
Или это мне просто так везет?
Скорее всего именно так
Pashan вне форума Ответить с цитированием
Старый 19.06.2009, 14:46   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Наверное, действительно везет.
Вот пример:
Код:
#include <iostream>
#include <conio.h>
#include <stdarg.h>
using namespace std;

int fun(int k,...)
{
 int a;
 va_list list;
 va_start(list,k);
 cout<<k<<endl;

 while((k=va_arg(list,int))!=0)
  {
   cout<<k<<endl;
  }
 va_end(list);
 return 0;
}

int main()
{
 fun(1,2,3,4,5,6,7);

getch();
return 0;
}
Выводит аргументы, пока не встретит ноль.
И вот то, что мне вывел:
Код:
1
2
3
4
5
6
7
2009222697
2009222722
4246688
2293624
4246790
4246688
16
2293680
4198987
1
4074488
4075104
4476928
2293668
-1
2293672
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 19.06.2009, 15:24   #8
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Значит придется делать с маркером(((
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменное имя объекта transgd Microsoft Office Excel 3 16.04.2009 12:17
переменное число вложенных циклов Evil Sun Общие вопросы C/C++ 4 31.03.2009 09:59
как в ХР запретить установку и удаление програм и изменение параметров дисплея? Dinya Безопасность, Шифрование 2 21.12.2008 21:30
Переменное имя создаваемого файла Degmax Win Api 2 27.03.2008 20:39
передача объектов как параметров функций в Dll Umen Общие вопросы Delphi 9 12.11.2006 19:31