Ошибка 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 С++ Express 2010.

Ответ 1

Вы пытаетесь вызвать eb и ec, прежде чем они будут объявлены или определены. Переместите определение ec до eb и до exera. Вы также можете переслать декларацию своих функций до того, как вы определите любой из них следующим образом:

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

Ответ 2

Вы вызываете eb из exera, перед объявлением eb. Компилятор предполагает, что он вернет int, затем найдет реализацию, которая возвращает void дальше файла.

Наиболее распространенным решением является объявление ваших локальных функций в верхней части файла

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

Ответ 3

Если вы собираетесь разместить функцию eb после точки, в которой она вызывается, тогда вам нужно разместить прототип для нее до ее вызова... иначе C будет использовать прототип по умолчанию, а затем ваш функция заканчивает переопределять ее, таким образом, полученную вами ошибку.

В качестве альтернативы вы можете перемещать функции непосредственно перед их использованием в исходном файле, но это не всегда возможно. Размещение прототипов в верхней части файла или, что еще лучше, в файле заголовка, который вы можете включить в любом месте, где вы будете использовать функции, является лучшей альтернативой.