2013-05-07 18 views
10

Mam następujący kod:Błąd C2371: redefinicja; różne podstawowe typy - dlaczego?

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

otrzymuję te błędy:

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 

Próbowałem zmienić nazwy funkcji - za nic.

Dlaczego ten błąd jest wyświetlany? Używam programu Visual C++ Express 2010.

+0

Definicja lub deklaracja prototypu są wymagane, zanim będzie można korzystać z funkcji. – BLUEPIXY

Odpowiedz

16

Próbujesz wywołać eb i ec, zanim zostaną one zadeklarowane lub zdefiniowane. Przenieś definicję ec przed eb i obie przed exera. Można też do przodu zadeklarować swoje funkcje przed określić któryś z nich tak:

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

Jesteś świetny :) wielkie dzięki. – Billie

+0

Cool. Ta odpowiedź pomogła mi po raz drugi. –

5

zadzwonić eb z exera przed eb jest zadeklarowana. Kompilator zakłada, że ​​zwróci int, a następnie znajdzie implementację, która zwróci plik void.

Najczęstszym rozwiązaniem jest zadeklarować lokalne funkcje w niedalekiej początku pliku

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

Jeśli masz zamiar umieścić funkcję eb po punkcie, w którym jest on nazywany, a następnie należy umieścić prototyp dla niego, zanim zostanie wywołany ... w przeciwnym razie C użyje domyślnego prototypu, a twoja funkcja kończy się na ponownym zdefiniowaniu go, a tym samym otrzymasz błąd.

Można również samodzielnie przenieść funkcje, zanim zostaną użyte w pliku źródłowym, ale nie zawsze jest to możliwe. Umieszczanie prototypów u góry pliku lub, jeszcze lepiej, w pliku nagłówkowym, który można uwzględnić w dowolnym miejscu, w którym będziesz korzystać z funkcji, jest najlepszą alternatywą.

Powiązane problemy