2013-05-07 21 views
10

Tôi có đoạn mã sau:Lỗi C2371: xác định lại; các loại cơ bản khác nhau - tại sao?

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

tôi nhận được các lỗi này:

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 

Tôi cố gắng để thay đổi tên hàm - cho không có gì.

Tại sao lỗi đó được hiển thị? Tôi đang sử dụng Visual C++ Express 2010.

+0

Định nghĩa hoặc tuyên bố mẫu thử là bắt buộc trước khi bạn có thể sử dụng hàm. – BLUEPIXY

Trả lời

16

Bạn đang cố gọi ebec trước khi được khai báo hoặc xác định. Di chuyển định nghĩa của ec trước eb và cả hai trước exera. Bạn cũng có thể chuyển tiếp tuyên bố chức năng của bạn trước khi bạn xác định ai trong số họ như vậy:

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

Bạn thật tuyệt vời :) cảm ơn rất nhiều. – Billie

+0

Tuyệt. Câu trả lời này đã giúp tôi lần thứ hai. –

5

Bạn gọi eb từ exera, trước khi eb được khai báo. Trình biên dịch giả định nó sẽ trả lại int sau đó tìm thấy một triển khai trả về void tiếp tục xuống tệp.

Việc sửa chữa phổ biến nhất là tuyên bố chức năng địa phương của bạn ở gần trên cùng của tập tin của bạn

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

Nếu bạn đang đi để đặt các chức năng eb sau điểm mà tại đó nó được gọi, sau đó bạn cần phải đặt một nguyên mẫu cho nó trước khi nó được gọi là ... nếu không, C sẽ sử dụng nguyên mẫu mặc định và sau đó chức năng của bạn kết thúc lên xác định lại nó, do đó lỗi bạn nhận được.

Hoặc, bạn có thể tự di chuyển các hàm trước khi chúng được sử dụng trong tệp nguồn, nhưng điều đó không phải lúc nào cũng có thể. Đặt nguyên mẫu ở đầu tệp hoặc, vẫn tốt hơn, trong một tệp tiêu đề bạn có thể bao gồm bất cứ nơi nào bạn sẽ sử dụng các hàm là giải pháp thay thế tốt nhất.

Các vấn đề liên quan