Intereting Posts
Как избавиться от консоли при написании программ GUI с помощью gtk в C? Понимание OpenGL Как получить все дочерние дочерние процессы id pid в c в linux Проверка четных или нечетных бит «1» в количестве ожидаемый неквалифицированный идентификатор до ‘->’ токена, как это исправить? Предупреждает ли Visual Studio C4028 предупреждение (формальный параметр, отличный от декларации)? Почему две переменные enums enums имеют одно и то же целочисленное значение? GDB поврежденный стек кадров – Как отлаживать? C Word Count программа Как определить, какую привязку D-Bus использовать Оценка состояния, содержащего униализированный указатель – UB, но может ли он сбой? Преобразовать неизвестные шестнадцатеричные цифры в долготу и широту проверить нулевые строки в запросе выбора Почему чтение происходит из файловой функции? оптимизированная сумма массива удвоений в C

Ошибка C2371: переопределение; разные базовые типы – почему?

У меня есть следующий код:

#include  #include  // helping void sortint(int numbers[], int array_size) { int i, j, temp; for (i = (array_size - 1); i > 0; i--) { for (j = 1; j  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 C ++ Express 2010.

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

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

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

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

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

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

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