Цель упражнения, которое я сейчас пытаюсь решить и понять, - создать функцию сортировки выбора общего назначения, а именно функцию сортировки, которая работает как с целыми числами, так и с типами данных double. Базовый c алгоритм сортировки по выбору был приведен в упражнении, поэтому все, что мне нужно сделать, это расширить его использование для более чем одного типа данных. Моя реализация функции выглядит следующим образом, что похоже на решение, предложенное автором:
void selection_sort(void *p, int n, enum data d)
{
int i,j,pos;
switch(d)
{
case INT:
for (i=0; i<n; i++)
{
pos=i;
for (j=i+1; j<n; j++)
{
if (((int *)p)[j]<((int *)p)[pos])
pos=j;
}
swap(&((int *)p)[i], &((int *)p)[pos], d);
}
break;
case DOUBLE:
for (i=0; i<n; i++)
{
pos=i;
for (j=i+1; j<n; j++)
{
if (((double *)p)[j]<((double *)p)[pos])
pos=j;
}
swap(&((double *)p)[i], &((double *)p)[pos], d);
}
break;
default:
exit(1);
}
}
Моя реализация функции подкачки показана ниже:
void swap(void *a, void *b, enum data d){
switch(d)
{
case INT:
*((int *)a) = *((int *)a)+*((int *)b);
*((int *)b) = *((int *)a)-*((int *)b);
*((int *)a) = *((int *)a)-*((int *)b);
break;
case DOUBLE:
*((double *)a) = *((double *)a)+*((double *)b);
*((double *)b) = *((double *)a)-*((double *)b);
*((double *)a) = *((double *)a)-*((double *)b);
break;
}
}
Здесь мои проблема начинается. Предлагаемая реализация функции подкачки выглядит так:
void swap(void *a, void *b, enum data d)
{
int tempi;
double tempd;
switch(d)
{
case INT:
tempi=*(int *)a;
*(int *)a=*(int *)b;
*(int *)b=tempi;
break;
case DOUBLE:
tempd=*(double *)a;
*(double *)a=*(double *)b;
*(double *)b=tempd;
}
}
, которая работает с остальной частью моего кода, однако, когда я использую свою реализацию функции подкачки, она выдает ошибки. В предложенном решении автор создает временную переменную для целочисленного случая и одну для двойного случая, которые не нужны одновременно, поэтому в своей реализации я подумал о том, чтобы сэкономить место и немного его оптимизировать. Моя основная функция показана ниже:
#include <stdio.h>
#include <stdlib.h>
enum data{INT, DOUBLE};
void selection_sort(void *pinakas, int n, enum data d);
void swap(void *a, void *b, enum data d);
int main()
{
int a[10]={1,4,7,5,6,8,6,2,3,3};
int i;
for (i=0; i<10; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
selection_sort(a, 10, INT);
for (i=0; i<10; ++i)
{
printf("%d ", a[i]);
}
return 0;
}
При использовании авторской функции мой результат выглядит так:
1 4 7 5 6 8 6 2 3 3
1 2 3 3 4 5 6 6 7 8
Однако при использовании моей реализации я получаю следующее:
1 4 7 5 6 8 6 2 3 3
0 2 3 3 4 5 0 0 0 0
и я не понимаю почему. Я потратил довольно много времени, пытаясь найти ошибку, беспокоясь, что это могло быть что-то более глубокое в указателях, которые мне сейчас не хватает.
Заранее спасибо!