Функция получает только первое значение аргумента variadi c - PullRequest
0 голосов
/ 28 февраля 2020

Эта функция, очевидно, должна возвращать минимальное значение с плавающей запятой, но она всегда возвращает 0. Во время отладки я обнаружил, что функция va_arg() получает только эти 31 правильные значения, затем она получает некоторые странные числа, по одному из них каждый раз. 0. 0. 1002 *

float var_min(int, float, ...);

void main()
{
    cout << var_min(7, 31, 12, 4.5, 9, 22, 69, 8.21);
}

float var_min(int z, float, ...)
{
    int i = 0;
    float min, p;
    va_list ap;
    va_start(ap, z);
    min = va_arg(ap, float);
    for (i = 1; i < z; i++)
    {
        p = va_arg(ap, float);
        min = (min < p) ? min : p;
    }
    va_end(ap);
    return min;
}

Редактировать: это присваивание:

Определить минимум 10 чисел с плавающей запятой из строки (неявные значения или из КБ), используя функцию с переменным количеством параметров. Первые 7 значений будут рассматриваться вначале, следующие 3 и в конце эти 2 значения.

1 Ответ

1 голос
/ 28 февраля 2020

Чтобы использовать va_arg, начиная со второго аргумента, измените:

float var_min(int z, float, ...)

на:

float var_min(int z, ...)

(Если после всегда будет хотя бы один аргумент с плавающей точкой z, и вы sh включите его в список параметров, затем дадите ему имя, инициализируете min напрямую и измените va_start(ap, z), чтобы использовать его имя вместо z.)

Чтобы передать float или double аргументы в функцию переменного аргумента, они должны быть явно типа float или double; целочисленные типы не будут преобразованы в типы с плавающей точкой, поэтому:

var_min(7, 31, 12, 4.5, 9, 22, 69, 8.21);

должно быть:

var_min(7, 31., 12., 4.5, 9., 22., 69., 8.21);

В аргументах переменных float аргументы повышаются до double, поэтому va_arg(ap, float) должно быть va_arg(ap, double) в обоих местах, и float min, p; должно быть double min, p;.

void main() не является стандартным объявлением для main. Это может быть int main().

...