Недопустимые операнды для двоичного выражения, C

Im работает над функцией, которая принимает некоторые значения и находит значения min, max и average. Я передаю все функции по ссылке и получаю некоторые ошибки, когда я пытаюсь выполнять базовые операции, такие как + и / А именно, ошибка

Недопустимые операнды для двоичного выражения ('double *' и 'double *')

void MinMaxAvg(double *pA, double *min, double *max, double *avg, int lines, double *total )
{
    for (int i=0; i max)
            {
                max = &pA[i];
            }
        }

        total += &pA[i];     //<-- Errors on this line

    }

    avg = (total/lines);        //<-- Errors on this line.

}
4

3 ответы

Похоже, вы получаете некоторые из запутанных там типов. В вашем примере вы устанавливаете указатели на новое значение, а не на значение указанных указателей.

Первое должно быть:

*total += pA[i];

В то время как второе должно быть:

*avg = (*total/lines);

Фактически, вы, вероятно, захотите использовать разделение с плавающей запятой на вторую ошибку (некоторые компиляторы печально известны использованием целочисленного divison в неожиданных местах):

*avg = (*total/(double)lines);

You'll still be getting errors if you do it like that, however. For example &pA[i] > ... will result in a pointer comparison, i.e. the address of the pointers will be compared. Most likely not what you want.

5
добавлено
Какой компилятор будет генерировать целое подразделение?
добавлено автор Fred Foo, источник
Благодаря! Это делает бесконечный смысл! Полностью решены мои проблемы.
добавлено автор aprohl5, источник
рад, что это помогло ya;) - @larsmans Я видел, как минимум, некоторые версии компилятора Borland производят целые деления в таких случаях. Но, как ни странно, это не всегда так. Кажется, это ошибка в некоторых версиях, но я предполагаю, что это не единственный компилятор. Нет никакого вреда в добавлении броска, хотя, так лучше безопасно, чем жаль, не так ли?
добавлено автор Magnus, источник

Вы пытаетесь добавить адрес указателю, это не действительная операция.

Вы, вероятно, имели в виду:

*total += pA[i];

Your use of &pA seems very confused, as does the re-assignment of the pointers min and max.

Если у вас есть указатель на значение (например, double * min ), то * min - это то, как вы обращаетесь (читаете или записываете) указанное значение.

2
добавлено

В отличие от C ++ в языке C нет «pass by reference». Вы должны разыменовывать каждый указатель в коде, если хотите работать со значениями переменных. Теперь вы работаете с адресами переменных.

1
добавлено
Не совсем уверен, что вы подразумеваете под этим, так как мой код, похоже, работает нормально.
добавлено автор aprohl5, источник