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
два разных макроса уже определены для одной и той же работы, и ваше определение противоречит этому.
Вы можете выбрать использование своего определения, удалив
include
или использоватьstdlib
"S.В случае, если вам нужен 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);