Turbo C выдает мне "Объявление прекращено неправильно", когда я считаю, что мой код в порядке

Вот код:

#include<stdio.h>
#include<stdlib.h>

int min(int a, int b);
void mergesort(int arr[],int lb, int ub);
void merge(int arr[],int lower1,int upper1,int lower2,int upper2);
void print_arr(int arr[],int arr_size);

int main()
{
 int A[15]={56,12,59,67,0,45,2,6,108,216,67,71,25,84,67};
 int lower=0;
 int upper=14;
 mergesort(A,lower,upper);
 print_arr(A,upper);
 return 0;
}

int min(int a, int b)
{
 return (a<b)?a:b;
}

void mergesort(int arr[],int lb,int ub)
{
 int i,m;
 for(m=1;m<ub-lb;m++)
 {
  for(i=lb;i<ub;i+=2*m)
  {
   int from=i;
   int mid=i+m-1;
   int to=min(i+m+m-1,ub);
   merge(arr,from,mid,mid+1,to);
  }
 }
}

void merge(int arr[],int lower1,int upper1,int lower2,int upper2)
{
 int p,q,j,n;
 int L[100];
 p=lower1;q=lower2;n=0;

 while((p<=upper1)&&(q<=upper2))
 {
  L[n++]=((arr[p]<arr[q])?arr[p++]:arr[q++]);
 }

 while(p<=upper1)
 {
  L[n++]=arr[p++];
 }

 while(q<=upper2)
 {
  L[n++]=arr[q++];
 }

 for(p=lower1,n=0;p<=upper1;p++,n++)
 {
  arr[p]=L[n];
 }

 for(q=lower2,j=n;q<=upper2;q++,j++)
 {
  arr[q]=L[j];
 }
}

void print_arr(int arr[],int arr_size)
{
 int i=0;
 printf("[");
 while(i<arr_size)
 {
  printf("{%d}",arr[i]);
  i++;
 }
 printf("]\n");
}

Как видите, я запрограммировал итеративную сортировку слиянием. Теперь этот же код с небольшим изменением и без функции "min" отлично работал для рекурсивного. Но после того, как я добавил функцию "min", код не будет работать в Turbo C вообще, когда он работает в самых популярных сетевых IDE.

Пример: результат запуска Geeksforgeeks IDE: http://code.geeksforgeeks.org/GVDfs3

Университетские компьютеры также работают с Turbo C.

2 ответа

#include<stdlib.h>

Вышеупомянутый заголовок - ваш преступник. Удалите его, и он должен хорошо скомпилироваться. Это потому, что в stdlib.h min а также max два разных макроса уже определены для одной и той же работы, и ваше определение противоречит этому.

  1. Вы можете выбрать использование своего определения, удалив include или использовать stdlib"S.

  2. В случае, если вам нужен stdlib.h для любых других функций и вы все еще хотите использовать свои собственные min функция затем просто отменить объявление stdlib с #undef min незамедлительно после #include <stdlib.h>

Любое из них должно помочь.

На самом деле ваш код является допустимым C. (Я бы предложил int main(void) скорее, чем int main(), но это очень незначительный момент, а не то, на что жалуется Turbo C.) Он компилируется без ошибок, используя gcc с включенными предупреждениями.

Судя по другим ответам и комментариям, кажется, что Turbo C определяет макросы min а также max в <stdlib.h> заголовок. Эти макросы нестандартны, и фактически эти идентификаторы доступны для использования в пользовательском коде, как вы сделали здесь. Любая реализация C, которая определяет min а также max поскольку макросы в стандартном заголовке не соответствуют.

Это вина Turbo C, а не твоя.

Насколько я понимаю, Turbo C довольно старый и больше не поддерживается, поэтому, вероятно, нет способа исправить эту ошибку. (Вы можете отредактировать заголовок, предполагая, что он предоставлен в виде файла, но возиться с файлами реализации рискованно.) Так что переименование вашего min Функция является самым простым решением.

Помимо проблем с компиляцией, когда я запустил вашу программу, она выдала такой вывод:

[{0}{2}{6}{12}{25}{45}{56}{59}{67}{67}{67}{71}{84}{108}]

У сортируемого массива был элемент со значением 216, который не появляется в выводе. Проблема в вашем print_arr функция. Предполагается, что его вторым аргументом является количество элементов в массиве (15), но вы передаете ему индекс последнего элемента (14), поэтому он не может распечатать последний элемент.

Я не проверял, что код в противном случае правильный, но с print_arr Исправлено: вывод верен, по крайней мере, для тех значений ввода, которые вы используете.

Некоторые проблемы стиля:

Вы определяете A как массив из 15 элементов, затем используйте 14 в качестве индекса последнего элемента, повторяя информацию и усложняя обслуживание программы, если вы хотите изменить длину. Пусть компилятор подсчитает для вас элементы (компьютеры действительно хорошо умеют считать):

int A[]={56,12,59,67,0,45,2,6,108,216,67,71,25,84,67};
const int len = sizeof A / sizeof A[0];
mergesort(A, 0, len-1);
print_arr(A, len);
Другие вопросы по тегам