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.
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) ;
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
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.