Ошибка с конфликтующими типами в калькуляторе (деление)

#c

Вопрос:

Я создаю калькулятор для своего первого проекта на языке Си, и все работало нормально, пока я не реализовал разделение. Он продолжает выдавать мне ошибку «конфликтующие типы для div «, хотя функция точно такая же, как и у всех остальных.

 #include <stdio.h>
#include <stdlib.h>

int num1;
int num2;
char op;
int res;
int poscount;
int negcount;

int add(num1, num2) {
    res = num1   num2;
    printf("Result: %dn", res);
    if(res >= 0)
        poscount  = 1;
    else
        negcount  = 1;
    return res;
}
int sub(num1, num2) {
    res = num1 - num2;
    printf("Result: %dn", res);
    if(res >= 0)
        poscount  = 1;
    else
        negcount  = 1;
    return res;
}
int mul(num1, num2){
    res = num1 * num2;
    printf("Result: %dn", res);
    if(res >= 0)
        poscount  = 1;
    else
        negcount  = 1;
    return res;
}
int div(num1, num2) {
    res = num1 / num2;
    printf("Result: %dn", res)
    return res;
}
int main() {

    printf("Number: ");
    scanf("%d", amp;num1);    //Zahl 1
    while(op != '=') {
        printf("nOperator: ");
        scanf(" %c", amp;op);       //Operator
        if (op == '=') {         //Überprüfung ob User weiterrechnen will
            printf("Final result: %dn", res);
            printf("Number of positive: %dn", poscount);
            printf("Number of negatives: %dn", negcount);
            break;
        }
        printf("nNumber: ");
        scanf("%d", amp;num2);    //Zahl

        if(op == ' ') {
            num1 = add(num1, num2);  //Addition
        }
        else if(op == '-'){
            num1 = sub(num1, num2); //Subtraktion
        }
        else if(op == '*'){
            num1 = mul(num1, num2); //Multiplikation
        }
        else if(op == '/'){         //Divisionen
            if(num2 == 0) {
                printf("Division by 0.");  //Ausnahme Division durch 0
                printf("No new result.");
            }
            else {
                num1 = div(num1, num2);
            }
        else {
            printf("Unknown operator");
        }
        }
return 0;
}
 

Это мой кодекс. Есть какие-нибудь идеи?

Комментарии:

1. Это конфликт имен. Посмотрите на справочную страницу для div . Это библиотечная функция, объявленная в stdlib.h . Вы не можете переопределить его с помощью несовместимого объявления, не вступая в конфликт с stdlib.h . Самое простое решение-просто использовать другое имя.

2. Избегайте использования глобальных символов.

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

4. Также рекомендуется добавлять int параметры в определения функций. Это может не потребоваться, так как они будут по умолчанию int , но это хорошая практика, чтобы быть явным.

5. Неявное int было удалено из языка в C99. Это было более 20 лет назад (плюс — минус, в зависимости от … так много всего). Не используй его.

Ответ №1:

Ваша функция div имеет то же имя, что и функция стандартной библиотеки C div . Последнее возвращает значение типа div_t , а не an int , следовательно, сообщение об ошибке «конфликтующие типы».

Решение и хорошая общая практика заключаются в том, чтобы не иметь функции с тем же именем, что и функция из стандартной библиотеки C. Здесь, например, назовите свою функцию myDiv . Я понимаю, что это упражнение в программировании; в противном случае вы хотели бы использовать стандартные библиотечные функции вместо их повторного использования.

Некоторые дополнительные советы:

  • Не используйте глобальные переменные, если их использования можно разумно избежать. Так обстоит дело и здесь. Кроме того, не используйте имена переменных повторно в функциях (это называется затенением).
  • Инициализируйте poscount и negcount до 0.
  • Инициализируйте op до некоторого значения заполнителя (здесь, нет = ). Еще лучше перестроить код таким образом, чтобы op он сначала присваивался из входных данных, а затем оценивался.
  • Не полагайтесь на тип переменных по умолчанию int , но объявите тип явно.
  • Переменная «res», по-видимому, не используется. Разве результат не хранится в num1 ?
  • Используйте оператор предварительного приращения ( перед именем переменной) вместо = 1 .
  • Используйте оператор switch-вместо нескольких других-если.
  • Использование комментариев на английском языке облегчит понимание вашего кода более широкой аудиторией.

Рабочий код с некоторыми (не всеми) примененными исправлениями:

 #include <stdio.h>
#include <stdlib.h>

int poscount = 0;
int negcount = 0;

int add(int num1, int num2) {
    int res = num1   num2;
    printf("Result: %dn", res);
    if (res >= 0)
          poscount;
    else
          negcount;
    return res;
}

int sub(int num1, int num2) {
    int res = num1 - num2;
    printf("Result: %dn", res);
    if (res >= 0)
          poscount;
    else
          negcount;
    return res;
}

int mul(int num1, int num2){
    int res = num1 * num2;
    printf("Result: %dn", res);
    if (res >= 0)
          poscount;
    else
          negcount;
    return res;
}

int myDiv(int num1, int num2) {
    int res = num1 / num2;
    printf("Result: %dn", res);
    return res;
}

int main() {
    int num1;
    printf("Number: ");
    scanf("%d", amp;num1);    //Zahl 1

    char op = 'X'; // placeholder value
    while (op != '=') {
        printf("nOperator: ");
        scanf(" %c", amp;op);       //Operator
        if (op == '=') {         //Überprüfung ob User weiterrechnen will
            printf("Final result: %dn", num1);
            printf("Number of positive: %dn", poscount);
            printf("Number of negatives: %dn", negcount);
            break;
        }
        printf("nNumber: ");
        int num2;
        scanf("%d", amp;num2);    //Zahl

        if (op == ' ') {
            num1 = add(num1, num2);  //Addition
        }
        else if (op == '-'){
            num1 = sub(num1, num2); //Subtraktion
        }
        else if (op == '*'){
            num1 = mul(num1, num2); //Multiplikation
        }
        else if (op == '/'){         //Divisionen
            if (num2 == 0) {
                printf("Division by 0.");  //Ausnahme Division durch 0
                printf("No new result.");
            }
            else {
                num1 = myDiv(num1, num2);
            }
        }
        else {
            printf("Unknown operator");
        }
    }
    return 0;
}