@Sector567

Как возвращать(return) массив из функцию с переменным количеством параметров?

Вот задание:
ed66abd2abc74f3aa25aad64d22fe847.png

В чем моя ошибка?
Язык С (Си)
#include <stdio.h>
#include <stdlib.h>

#define END_PARAM -1

int max(double a, ...)
{
	double *p = &a;	/* указатель на значение параметра */
	double *str = (double*)malloc(30 * sizeof(double));

	while (*p != END_PARAM)
	{
		*str = *p;	/* перезаписываем в массив */

		str++;		/*переходим к следующему индексу в массиве*/
		p++;		/* переходим к следующемк параметру */
	}

	/* возвращаем результат */
	return *str;
}

void main()
{
	printf("result = %d\n\n", max(100.5, 25.5, 30.76, 9.1, 22.45, END_PARAM));

	system("pause");
}
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 3
zagayevskiy
@zagayevskiy
Android developer at Yandex
Первая ошибка - возвращать нужно не int, a double*.
Вторая - вывод в принтф - опять же выводите инт(%d), это неверно. Формата для вывода массива даблов нет, насколько я знаю, надо выводить в цикле.
Третья - выделение памяти неправильное. Откуда взялось 30 * sizeof(double)? Надо пройти по параметрам, сначала узнать размер, затем скопировать. Копировать можно с помощью memcpy, кстати, а не циклом.
И ходить так по списку параметров кажется неправильно, не знаю.
Ответ написан
DanielDemidko
@DanielDemidko
Программист
Ужас. Возвращать результат разыменования double* в int функции это сильно.
Видимо от вас ожидали в общих чертах примерно следующего:
double *const getArray() {
    double *const result = new double[10];
    // Заполняйте массив как вам угодно
    return result;
}
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Вы гуляете по памяти в надежде, что параметры передаются через стек, но на деле это может быть не так и довольно часто компилятор передаёт их через регистры. Для этого есть специальные средства, гугли va_list
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы