【发布时间】:2014-06-08 22:17:22
【问题描述】:
我正在尝试对 C 中任何类型的数组(性能不是问题,因此我使用冒泡排序)进行排序,为此我将排序函数传递给它应该用来比较不同的比较函数类型(compareInt、compareDouble、compareString 等...)。 我的程序适用于 int,但是当我使用 double/string/其他任何东西时表现得非常奇怪...... W
出了什么问题,我该如何解决?
我的代码:
int main(void)
{
int a[] = {2, 7, 6, 4, 1};
double b[] = {12.5, 2.7, 3.0, 5.5, 5.9, 1.0};
char c[] = {'c', 'a', 'b', 'd'};
char * d[] = {"abc", "bca", "cba", "abcd"};
char e[][4] = {"bca", "abc", "cba", "dca", "za"};
printArray(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), printInt);
printArray(b, sizeof(b[0]), sizeof(b)/sizeof(b[0]), printDouble);
printArray(c, sizeof(c[0]), sizeof(c)/sizeof(c[0]), printChar);
//printArray(d, sizeof(d[0]), sizeof(d)/sizeof(d[0]), printStringPointer);
//printArray(e, sizeof(e[0]), sizeof(e)/sizeof(e[0]), printStringArray);
printf("\n");
sort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), compareInt);
sort(b, sizeof(b)/sizeof(b[0]), sizeof(b[0]), compareDouble);
sort(c, sizeof(c)/sizeof(c[0]), sizeof(c[0]), compareChar);
//sort(d, sizeof(d)/sizeof(d[0]), sizeof(d[0]), compareStringPointer);
//sort(e, sizeof(e)/sizeof(e[0]), sizeof(e[0]), compareStringArray);
printArray(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), printInt);
printArray(b, sizeof(b[0]), sizeof(b)/sizeof(b[0]), printDouble);
printArray(c, sizeof(c[0]), sizeof(c)/sizeof(c[0]), printChar);
//printArray(d, sizeof(d[0]), sizeof(d)/sizeof(d[0]), printStringPointer);
//printArray(e, sizeof(e[0]), sizeof(e)/sizeof(e[0]), printStringArray);
printf("\n");
getchar();
return 0;
} // pay no attention to the printArray methods, as they are just for debugging purposes.
int compareInt(void * p1, void * p2)
{
return *(int *)p1 - *(int *)p2;
}
int compareDouble(void * p1, void * p2)
{
double d = *(double *)p1 - *(double *)p2;
if(d > 0) return 1;
if(d == 0) return 0;
return -1;
}
int compareChar(void * p1, void * p2)
{
return *(char *)p1 - *(char *)p2;
}
void sort(void * arr, int arrLength, int sizeOfElement, int (*compare)(void *, void *))
{
int i, j;
for(i = 0; i < arrLength; i++) // arrlength -1?
for(j = 0; j < arrLength - 1; j++)
{
//printf("%c, %c", *((char *)arr + j * sizeOfElement), *((char *)arr + (j + 1) * sizeOfElement));
if(compare(((char *)arr + j * sizeOfElement), ((char *)arr + (j + 1) * sizeOfElement)) > 0) swap(((char *)arr + j * sizeOfElement), ((char *)arr + (j + 1) * sizeOfElement));
}
}
void swap(void ** p1, void ** p2)
{
void * p3 = *p1;
*p1 = *p2;
*p2 = p3;
}
(我也计划将它用于字符串,这就是数组 d 和 e 存在的原因,但我还没有为字符串编写比较函数。)
程序的输入(printArray 打印的数组):
2, 7, 6, 4, 1,
12.500000, 2.700000, 3.000000, 5.500000, 5.900000, 1.000000,
c, a, b, d,
程序的输出(按 printArray 打印排序后的数组):
1, 2, 4, 6, 7,
12.500000, 2.700000, 3.000000, 5.500000, 5.900000, 1.000000,
a, a, a, c,
非常感谢。
【问题讨论】:
-
要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,你就发现了你的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
-
您的代码无法编译;尝试发布一个简短的、独立的、正确的(可编译的)示例。
-
如果
swap不知道它正在交换的对象的大小,你如何期望它工作? (提示:假设对象与void*大小相同,不适用于与void*大小不同的对象。)