Функция должна иметь ошибку прототипа
Я написал следующую программу на C:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int count;
scanf("%d",&count);
if(count < 1 || count > 100)
{
exit(1);
}
int inputs[10];
for(int i = 0; i < count; i++)
{
scanf("%d",&inputs[i]);
if(inputs[i] < 1 || inputs[i] > 30000)
{
exit(1);
}
}
for(i = 0; i < count; i++)
{
printPrimeFactor(inputs[i], 2);
printf("\n");
}
}
void printPrimeFactor(int number, int factor)
{
if(number % factor == 0)
{
int flag = 1, newNumber;
newNumber = number;
for(int i = 0; i < factor/2; i++)
{
if(factor % i == 0)
{
flag = 0;
break;
}
}
if (flag)
{
printf("%d ", factor);
newNumber = number / factor;
}
factor++;
if(factor <= newNumber / factor)
{
printPrimeFactor(newNumber, factor);
}
}
}
И при компиляции (в Windows, Turbo C) я получаю сообщение об ошибке:
Function 'printPrimeFactor' should have a prototype error
Я не мог найти никаких проблем с кодом. В чем может быть проблема?
7 ответов
Ваша функция вызывается до того, как компилятор увидит ее определение, поэтому компилятор говорит: "Я хочу сначала посмотреть прототип этой функции".
Это означает, что вы положили void printPrimeFactor(int number, int factor);
до вызова функции.
Кроме того, вы можете поместить всю функцию (то есть ее определение) перед вызовом.
Насколько мне известно, функция должна иметь ошибку прототипа: есть 2 способа:- 1) если вы определяете имя вашей функции перед main(), это называется объявлением функции, например:
#include<stdio.h>
#include<stdlib.h>
void prinPrimeFactor(int number, int factor);
void main()
а также
2) если вы используете вашу общую функцию перед main(), то она работает как
#include<stdio.h>
#include<stdlib.h>
void primePrimeFactor(int number, int factor)
{
statement(s);
}
void main()
{
statement(s);
}
Вам нужно добавить прототип функции, если у вас есть функция, определенная после main
функция.
Так, Добавить
void printPrimeFactor(int number, int factor);
перед main
функция.
Также,main
возвращается int
не void
,
Когда компилятор встречает вызов printPrimeFactor()
в main()
, он еще не видел определения, поэтому необходимо предположить, что это функция, возвращающая int
и количество и типы параметров выводятся из аргументов, переданных вызову при первом обнаружении.
В этом случае, printPrimeFactor()
не возвращает int
, Когда определение встречается, компилятор обнаруживает разницу между сигнатурой определения и выведенным объявлением. Решение состоит в том, чтобы определить перед использованием или добавить явное объявление прототипа перед использованием. Так, например, раньше main()
добавлять:
void printPrimeFactor(int number, int factor) ;
ANSI C89 и ISO C90 допускают неявные объявления, C99 и C++ не позволяют. На самом деле очень мало причин, по которым вам следует использовать античный 16-битный компилятор. Не в последнюю очередь потому, что ни IDE, ни компилятор, ни генерируемый им код даже не будут работать на Win64.
Компилятор хочет увидеть все функции, которые есть в программе, до ее вызова. Таким образом, вы либо пишете всю функцию перед main, либо передаете прототип функции перед main и пишете функцию после main.
Таким образом, в приведенной выше программе функция "void printPrimeFactor(int number, int factor)" находится после main, поэтому вам нужно будет предоставить прототип функции. Прототип функции - это не что иное, как полное имя функции, т.е.
void printPrimeFactor(int number, int factor)
Так что программа должна прийти вот так
#include<stdio.h>
#include<stdlib.h>
void printPrimeFactor(int number, int factor)
void main()
{