Функция должна иметь ошибку прототипа

Я написал следующую программу на 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);
}

Вы должны объявить printPrimeFactor() перед main()

Вам нужно добавить прототип функции, если у вас есть функция, определенная после 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()
 {

из-за неправильного заголовочного файла <stdib.h>

Другие вопросы по тегам