2014-09-20 24 views
0

我寫了下面的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中,渦輪C),我保持收到錯誤:

Function 'printPrimeFactor' should have a prototype error 

我找不到任何代碼問題。可能是什麼問題?

+3

把'無效printPrimeFactor(INT數,INT因子);'聲明之前'main' – 2014-09-20 11:46:44

+3

爲什麼還在使用的Turbo-C?有幾個編譯器是[自由軟件](http://fsf.org/)(例如[GCC](http://gcc.gnu.org/)....),並且更符合標準,提供了良好的診斷,並且優化更好。 – 2014-09-20 11:57:20

+0

這行:int inputs [10];應該是int輸入[count];所以代碼將有正確大小的輸入插槽可用。 – user3629249 2014-09-22 05:49:03

回答

4

編譯器已經看到了它的定義之前,您的函數被調用,所以編譯器說:「我想先看看這個函數的原型」。

這意味着你的函數調用之前把void printPrimeFactor(int number, int factor);

或者,你可以在呼叫前將整個功能(即它的定義)。

+0

@PiotrS。問題是,隱式地假設它返回一個'int'它後來被定義爲返回'void'。這是任何C編譯器中的錯誤。使用Turbo-C是各種其他原因的問題;但不是這一個。自ISO C99以來,聲明是必需的,但Turbo-C會在此之前進行聲明。 – Clifford 2014-09-20 12:21:04

1

你應該申報printPrimeFactor()之前的主()

1

你需要,如果你有main功能後定義的函數來添加函數原型。

所以,main函數之前添加

void printPrimeFactor(int number, int factor); 

另外,main返回int而不是void

+0

「main returns int not void」,這是C,而不是C++ – 2014-09-20 12:09:33

1

當編譯器遇到調用在main()printPrimeFactor(),它目前還沒有看到的定義,所以它是必需的,以假定它是返回一個int的功能,並且所述數量和類型的參數是從所述推斷第一次遇到傳遞給調用的參數。

在這種情況下,printPrimeFactor()不返回int。當遇到定義時,編譯器會檢測定義簽名和推斷聲明之間的差異。解決方案是在使用前定義使用前或添加顯式原型聲明。因此,例如前main()地址:

void printPrimeFactor(int number, int factor) ; 

ANSI C89和C90 ISO允許隱式聲明,C99和C++沒有。爲什麼你應該使用古老的16位編譯器的原因實在是少之又少。不僅僅是因爲IDE,編譯器和它生成的代碼都不會在Win64上運行。

0

編譯器希望在調用之前查看程序中的所有函數。所以你要麼在main之前編寫整個函數,要麼在main之前給函數的原型並在main之後編寫函數。

所以在上面的程序中的功能「無效printPrimeFactor(INT數,INT因子)」是後主所以你必須給函數的原型。函數的原型不過是函數的全名,即i。Ë

void printPrimeFactor(int number, int factor) 

那麼的程序應該是這樣

#include<stdio.h> 
#include<stdlib.h> 
void printPrimeFactor(int number, int factor) 
void main() 
{