Pow: неоднозначный вызов перегруженной функции

У меня проблема, не могу найти решение.

Выдает ту же ошибку:

Pow: неоднозначный вызов перегруженной функции

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

int main() 
{
    int a, i, n, product, result=1;

    printf("enter a number\n");
    scanf("%d", &a);

    printf("enter n number\n");
    scanf("%d", &n);

    for(i = 1; i < n; i++) {
        product = pow(a, i);
        result *= product;
    }
    printf("the result is %d", result);

    return 0;
}

person Community    schedule 20.12.2015    source источник
comment
вам нужно инициализировать result=1, иначе он будет использовать значение мусора   -  person Punit Vara    schedule 20.12.2015
comment
вы компилируете как C++. перейти в режим С.   -  person BLUEPIXY    schedule 20.12.2015
comment
@BLUEPIXY это не сработало   -  person    schedule 20.12.2015
comment
@punitvara хорошее замечание, спасибо, но это не сработало   -  person    schedule 20.12.2015
comment
Я могу скомпилировать без ошибок (есть предупреждение. :D). Работает ли программа правильно, это другой вопрос.   -  person BLUEPIXY    schedule 20.12.2015
comment
Выбранный дубликат C++ не очень хорошо объясняет ошибку здесь. Номинация на повторное открытие.   -  person chux - Reinstate Monica    schedule 20.12.2015
comment
@chux Плохое использование молотка для обмана, на мой взгляд. Спрашивающий на самом деле компилирует C++, и обманщик прекрасно это объясняет.   -  person David Heffernan    schedule 20.12.2015
comment
@chux: согласен с Дэвидом Хеффернаном. В C нет перегрузок; компилятор не может быть компилятором C. Повторяющийся вопрос хорошо объясняет проблему — сообщения компилятора в вопросе показывают, что передача int в качестве первого аргумента pow() в C++ приводит к двусмысленности, потому что int необходимо преобразовать, и его можно преобразовать в float, double или long double с одинаковой легкостью, приводит к двусмысленности. Тот факт, что люди в конечном итоге используют компилятор C++ для компиляции кода C, является отдельным источником раздражения — я предполагаю, что они сбиты с толку используемой IDE.   -  person Jonathan Leffler    schedule 20.12.2015
comment
@Jonathan Leffler Если этот пост просматривается как помеченный C, решения включают использование универсальной математики типов с <tgmath.h> с действиями, очень похожими на перегрузки C++. Я согласен, что это, безусловно, OP с использованием компилятора C ++ для кода C. Пользователь, имеющий проблемы с pow() и фильтрующий по C, не найдет этот дубликат, поскольку это другой язык. Решения-кандидаты в C отличаются от C++, и поэтому я по-прежнему утверждаю, что заявленный обман является плохим кандидатом.   -  person chux - Reinstate Monica    schedule 20.12.2015
comment
@chux: нам придется согласиться не согласиться. Если бы в коде был хоть какой-то признак #include <tgmath.h>, я мог бы проявить больше сочувствия. Как бы то ни было, компиляция кода с помощью компилятора C++ означает, что вы получаете сообщения об ошибках C++ для проблем, которые появляются только при использовании компилятора C++ вместо компилятора C, независимо от того, почему вы используете неправильный компилятор.   -  person Jonathan Leffler    schedule 20.12.2015
comment
@David Heffernan Как вы определили исходный дубликат после того, как сообщение было повторно открыто?   -  person chux - Reinstate Monica    schedule 20.12.2015
comment
@chux Вы можете увидеть это в истории редактирования   -  person David Heffernan    schedule 20.12.2015
comment
@ Дэвид Хеффернан Спасибо. Что касается оригинального дубликата, это был C++, где OP не включал <math.h>, и поэтому я не согласен с тем, что обман прекрасно объясняет это.. Возможно, вы подумали, что мой голос был за очередной дурак?   -  person chux - Reinstate Monica    schedule 20.12.2015
comment
@chux Я честно не понимаю, почему вы продолжаете утверждать, что это вопрос C. C не имеет перегрузок. Я уверен, вы знаете это.   -  person David Heffernan    schedule 20.12.2015
comment
@David Heffernan Это вопрос C, потому что OP назвал его C, вероятно, хотел, чтобы это был C, и опубликованный код имеет много признаков хорошего C (.h, scanf(), printf()) по сравнению с C-ish C++. Проблема OP, вероятно, заключалась не в использовании компилятора C. 2) C есть что-то очень похожее на перегрузку. Это возможно с _Generic и намеренно доступно с <tgmath.h>, что заставит исходный код C pow(float) и pow(double) вызывать разные функции. Поскольку сообщение OP относится к pow(), это соображение актуально.   -  person chux - Reinstate Monica    schedule 20.12.2015
comment
@chux Как и Джонатан, я с тобой не согласен   -  person David Heffernan    schedule 20.12.2015
comment
Давайте продолжим обсуждение в чате.   -  person chux - Reinstate Monica    schedule 20.12.2015


Ответы (1)


Основная проблема - неинициализированные переменные, а именно result, у которых нет допустимого значения для использования в строке:

result *= product;  

а затем некоторые неявные преобразования при использовании функции pow(). Не существует перегруженного экземпляра pow(), содержащего int и int в качестве первого и второго параметров и int в качестве возвращаемого значения.

Вам следует определить свои аргументы соответствующим образом в соответствии со списком аргументов, поддерживаемых функцией, который в C с использованием заголовка math.h выглядит следующим образом:

double pow(double x, double y)

в противном случае вы можете столкнуться с последствиями получения неожиданных результатов, поскольку компилятор неявно выполняет сужающие преобразования. Узнайте об опасности неявных преобразований здесь.

person Ziezi    schedule 20.12.2015