LINUX.ORG.RU

функция с переменным числом параметров


0

0

Необходимо написать функцию с переменным числом параметров, так вот проблема в указанной строчке происходит ошибка сегментирования... кто пожскажет в чем трабла?
double medium (double x,...){

double zn=0, float_temp, h=0;
va_list temp;
va_start(temp,x);

if (x != -1) zn=x;
else {
puts("Неверный ввод");
return 0;
}
h++;
while (float_temp != -1){
zn+=float_temp;
float_temp=va_arg(temp,double); /*в этой строчке происходит ошибка сегментирования*/
h++;
}

va_end(temp);

return (zn/h);
}

anonymous
Ответ на: комментарий от Legioner

Впрочем попробую угадать. Функция вызывается так: medium(1, 2, 3, -1)

В этом случае параметры в стек кладутся как int-ы (4 байта на 32 битной системе), а берутся по 8 байтов (как double), и достаётся, естественно мусор, к исходным числам не имеющий отношения.

Также не забывайте, что сравнивать два double-е операцией != чаще всего некорректно.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Вот рабочий пример:

#include <stdarg.h>
#include <math.h>
#include <stdio.h>

#define EPS 1e-16

double medium (double x,...)
{
	double sum = 0;
	unsigned count = 0;
	double arg;

	va_list va;
	va_start(va, x);

	arg = x;

	while (fabs(x + 1) >= EPS) {
		sum += x;
		++count;
		x = va_arg(va, double);
	}
	va_end(va);
	return sum / count;
}

int main(void)
{
	printf("%f\n", medium(1.0, 2.0, 3.0, -1.0));
	return 0;
}

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

float_temp инициализируется, вы просто незаметили =). На счет вызова функции вы угадали. А за пример спасибо щас попробуем разобраться.

anonymous
()
Ответ на: комментарий от anonymous

ошибся, действительно неиницилизируется =)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.