Ошибка: Конфликтующие типы для «pow» в C

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

Пример. S равно 0, K равно 1 и E равно 2.
Формула общей стоимости: ((A*10)+(B))*10^C

A - первый вход B - 2-й вход C - 3-й вход.
Предполагается, что функция int lettervalue(char letter) возвращает значение буквы. Я использовал конструкцию переключателя для присвоения буквенного значения.

Каждый раз, когда я компилирую, я получаю error: conflicting types for 'pow'. Принимает ли функция pow переменные, и нужно ли что-то изменить в функции int lettervalue(char letter)?

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

int pow(int x, int y);

int lettervalue(char letter)
{
    int val;
    switch (letter){
        case 'S':
        case 's':
            val = 0;
            break;
        case 'K':
        case 'k':
            val = 1;
            break;
        case 'E':
        case 'e':
            val =2;
            break;
    }
    return val;
}

int main(void)
{   int valueA, valueB, valueC, totalvalue;
    char A, B, C;
    printf("Please input the letter: ");
    scanf("%c%c%c", &A, &B, &C);                
    valueA = lettervalue(A)*10;
    valueB = lettervalue(B);
    valueC = lettervalue(C);
    totalvalue = (valueA+valueB)*pow(10, valueC);
    printf("The total value is %d", totalvalue );

    return 0;
}

person Community    schedule 06.01.2014    source источник
comment
Почему у вас есть подпись для библиотечной функции? Разве это не (часть) того, для чего нужны файлы .h?   -  person Scott Hunter    schedule 06.01.2014
comment
подпись? Вы имеете в виду 'int pow (int x, int y);' в начале, если я удалю это, я получу «неопределенную ссылку на pow»   -  person    schedule 06.01.2014
comment
@honmayanranger Вы удалили #include <math.h> или int pow(int x, int y); или оба? Вам следует удалить только int pow(int x, int y); и оставить #include <math.h>.   -  person chux - Reinstate Monica    schedule 06.01.2014
comment
Второстепенный: используйте int val = 0; в lettervalue() для работы со значениями letter, которые не являются SsKkEe.   -  person chux - Reinstate Monica    schedule 06.01.2014
comment
@chux удален int pow(int x, int y); Только   -  person    schedule 06.01.2014


Ответы (3)


Код излишне предоставляет прототип pow(), который несовместим с прототипом в math.h.

#include <math.h>
// math.h provides: double pow(double x, double y);

Устранить int pow(int x, int y);.

Изменить код

// totalvalue = (valueA+valueB)*pow(10, valueC);
totalvalue = (valueA+valueB)* ((int)pow(10, valueC));

Or

double total;
total = (valueA+valueB)*pow(10, valueC);
printf("The total value is %.0lf", total );

Обязательно сделайте ссылку в математической библиотеке, чтобы избежать «неопределенной ссылки на pow».

неопределенная ссылка `pow' даже с math.h и ссылкой на библиотеку -lm

person chux - Reinstate Monica    schedule 06.01.2014
comment
@honmayanranger После того, как вы получите 15+ репутации, подумайте о том, чтобы проголосовать за все публикации, которые вы считаете полезными. - person chux - Reinstate Monica; 06.01.2014

если вы уже используете math.h, вам не нужно объявлять функцию pow. Поэтому удаление строки int pow(int x,int y); должно помочь.

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

int pow(int x, int y)
{
  int result=1,i;
  for(i=1;i<=y;i++)
    result *=x;

  return result;
}

p/s: поскольку функция pow растет очень быстро, я предлагаю вам использовать значение long вместо int

person Tu Bui    schedule 06.01.2014
comment
Это тоже сработало, но есть предупреждение: конфликтующие типы для pow [включено по умолчанию], но возвращалось то же значение. Спасибо :) - person ; 06.01.2014
comment
вы исключили библиотеку math.h при определении функции pow? В качестве альтернативы вы можете просто определить его с другим именем, например, int power (int x, int y) - person Tu Bui; 07.01.2014

Функция pow() определена в math.h как:

double pow (double base, double exponent);

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

Просто удалите прототип pow().

person rullof    schedule 06.01.2014
comment
удаляя его, компилятор отображает неизвестную ссылку на pow - person ; 06.01.2014
comment
@honmayanranger Возможно, вам понадобится ссылка на математическую библиотеку. добавьте флаг -lm при компоновке вашей программы.. - person nos; 06.01.2014
comment
@honmayanranger математическая библиотека не связана. - person rullof; 06.01.2014