2013-05-07 41 views
10

我有以下代碼:錯誤C2371:重新定義;不同的基本類型 - 爲什麼?

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

// helping 
void sortint(int numbers[], int array_size) 
{ 
    int i, j, temp; 

    for (i = (array_size - 1); i > 0; i--) 
    { 
    for (j = 1; j <= i; j++) 
    { 
     if (numbers[j-1] > numbers[j]) 
     { 
     temp = numbers[j-1]; 
     numbers[j-1] = numbers[j]; 
     numbers[j] = temp; 
     } 
    } 
    } 
} 

// exer1 - A 

void sort(int** arr, int arrsize) { 
    int i = 0; 
    // sort.... 
    for(; i < arrsize; ++i) { 
     sortint((*(arr+i))+1, **(arr+i)); 
    } 
} 

// Exer1 - B 

void print(int** arr, int arrsize) { 
    int i = 0, j, size, *xArr; 
    for(; i < arrsize; ++i) { 
     size = **(arr+i); 
     xArr = *(arr+i); 
     printf("size: %d: ", size); 
     // print elements 
     for(j = 1; j <= size; ++j) printf("[%d], ", *(xArr+j)); 
     printf("\n"); 
    } 
} 

// Exer2: 

void exera() { 
    int* ptr = (int*)malloc(sizeof(int)); 
    if(!ptr) exit(-1); 
    eb(ptr); 
    free(ptr); 
} 

void eb(int* ptr) { 
    int* arr = (int*) malloc(sizeof(int) * (*ptr)); 
    int i = 0; 
    for(; i < *ptr; ++i) scanf("%d", arr+i); 
    ec(arr, *ptr); 
} 

void ec(int* arr, int size) { 
    int i; 
    sortint(arr, size); 
    for(i = 0; i < size; ++i) printf("[%d], ", *(arr+i)); 
} 

int main() { 
    // Exer1: 
    int a[] = {4,3,9,6,7}; 
    int b[] = {3,2,5,5}; 
    int c[] = {1,0}; 
    int d[] = {2,1,6}; 
    int e[] = {5,4,5,6,2,1}; 
    int* list[5] = {a,b,c,d,e}; 
    sort(list, 5); // A 
    print(list, 5); // B 
    printf("\n\n\n\n\n"); 
    // Exer2: 
    exera(); 
    fflush(stdin); 
    getchar(); 
    return 0; 
} 

我得到這些錯誤:

Error 2 error C2371: 'eb' : redefinition; different basic types 
source.c 56 

Error 4 error C2371: 'ec' : redefinition; different basic types 
source.c 63 

Warning 1 warning C4013: 'eb' undefined; assuming extern returning int  
source.c 52 

Warning 3 warning C4013: 'ec' undefined; assuming extern returning int  
source.c 60 

我試圖改變函數名 - 白白。

爲什麼該錯誤正在顯示?我正在使用Visual C++ Express 2010.

+0

在使用函數之前,需要原型定義或聲明。 – BLUEPIXY 2013-05-07 16:42:10

回答

16

您正試圖在聲明或定義之前調用ebec。在eb之前和exera之前移動ec的定義。

void eb(int* ptr) ; 
void ec(int* arr, int size) ; 
+0

你很棒:)非常感謝。 – Billie 2013-05-07 16:43:21

+0

很酷。這個答案現在幫助我第二次了。 – 2018-02-26 02:08:42

5

你從exera調用eb,聲明eb之前:您也可以向前定義之前的任何人,像這樣聲明的功能。編譯器假定它會返回int,然後找到一個實現,該實現返回文件後面的void

最常見的解決方法是在你的文件的近頂部

void eb(int* ptr); 
// repeat for each other function which generates the same error 
1

如果你要去的地方的功能eb在它被稱爲後點,那麼你需要的地方,聲明你的本地函數一個在它被調用之前的原型...否則,C將使用默認的原型,然後你的函數將重新定義它,從而導致你收到的錯誤。

或者,您可以在使用源文件之前自行移動函數,但這並非總是可行。將原型放置在文件的頂部,或者更好的是,在一個頭文件中,你可以在任何地方使用這些函數,這是最好的選擇。

相關問題