#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;
}