web-dev-qa-db-fra.com

Erreur C2371: redéfinition; différents types de base - pourquoi?

J'ai le code suivant:

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

Je reçois ces erreurs:

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

J'ai essayé de changer les noms des fonctions - pour rien.

Pourquoi cette erreur est-elle affichée? J'utilise Visual C++ Express 2010.

11
Billie

Vous essayez d'appeler eb et ec avant qu'ils soient déclarés ou définis. Déplacez la définition de ec avant eb et les deux avant exera. Vous pouvez également transférer vos fonctions avant de définir l'une d'entre elles, comme ceci:

void eb(int* ptr) ;
void ec(int* arr, int size) ;
17
Shafik Yaghmour

Vous appelez eb à partir de exera, avant que eb ne soit déclaré. Le compilateur suppose qu'il retournera int puis trouvera une implémentation qui renverra void plus loin dans le fichier.

La solution la plus courante consiste à déclarer vos fonctions locales en haut de votre fichier.

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

Si vous allez placer la fonction eb après le point où elle est appelée, vous devez alors placer un prototype avant de l'appeler ... sinon, C utilisera le prototype par défaut et votre fonction finira par la redéfinir. , donc l'erreur que vous avez reçue.

Alternativement, vous pouvez déplacer les fonctions elles-mêmes avant qu'elles ne soient utilisées dans le fichier source, mais ce n'est pas toujours possible. Placer les prototypes en haut du fichier ou, mieux encore, dans un fichier d'en-tête que vous pouvez inclure n'importe où vous utiliserez les fonctions est la meilleure alternative.

1
K Scott Piel