C 冒泡故障
gcc编译以下代码时没有错误。我正在创建一个冒泡排序函数,它可以用于任何数据类型的数组(因此是函数指针) 它对字符串数组(arr2)进行排序没有问题,但是,我不明白为什么它不能对整数数组(arr)进行正确排序。我在compare_long函数中添加了printf语句,以查看发生了什么。看起来整数没有被正确地传递给它。任何帮助都将不胜感激C 冒泡故障,c,debugging,sorting,pointers,bubble-sort,C,Debugging,Sorting,Pointers,Bubble Sort,gcc编译以下代码时没有错误。我正在创建一个冒泡排序函数,它可以用于任何数据类型的数组(因此是函数指针) 它对字符串数组(arr2)进行排序没有问题,但是,我不明白为什么它不能对整数数组(arr)进行正确排序。我在compare_long函数中添加了printf语句,以查看发生了什么。看起来整数没有被正确地传递给它。任何帮助都将不胜感激 #包括 #包括 #定义最大值为256 长arr[10]={3,6,1,2,3,8,4,1,7,2}; char arr2[5][20]={“米老鼠”, “唐老
#包括
#包括
#定义最大值为256
长arr[10]={3,6,1,2,3,8,4,1,7,2};
char arr2[5][20]={“米老鼠”,
“唐老鸭”,
“米妮老鼠”,
“傻瓜”,
“冥王星”};
空心气泡(空心*p,内部宽度,内部N,内部(*fptr)(常数空心*,常数空心*);
int比较_字符串(const void*m,const void*n);
int比较长(常量无效*m,常量无效*n);
内部主(空){
int i;
放置(“\n排序前:\n”);
对于(i=0;i<10;i++){/*显示长整数*/
printf(“%ld”,arr[i]);
}
卖出(“\n”);
对于(i=0;i<5;i++){/*显示字符串*/
printf(“%s\n”,arr2[i]);
}
气泡(arr,4,10,比较长);/*对长排序*/
气泡(arr2、20、5,比较_字符串);/*对字符串进行排序*/
放置(“\n\n排序后:\n”);
对于(i=0;i<10;i++){/*显示已排序的长度*/
printf(“%d”,arr[i]);
}
卖出(“\n”);
对于(i=0;i<5;i++){/*显示已排序的字符串*/
printf(“%s\n”,arr2[i]);
}
返回0;
}
空隙气泡(空隙*p,空隙宽度,空隙N,空隙(*fptr)(常数空隙*,常数空隙*){
int i,j,k;
无符号字符buf[MAX_buf];
无符号字符*bp=p;
对于(i=N-1;i>=0;i--){
对于(j=1;j 0){
memcpy(buf,bp+宽度*(j-1),宽度);
memcpy(bp+width*(j-1),bp+j*width,width);
memcpy(bp+j*宽度,buf,宽度);
}
}
}
}
int比较_字符串(常量无效*m,常量无效*n){
字符*m1=(字符*)m;
char*n1=(char*)n;
返回(strcmp(m1,n1));
}
整数比较长度(常数无效*m,常数无效*n){
长*m1,*n1;
m1=(长*)m;
n1=(长*)n;
printf(“m1=%l和n1=%l\n”,*m1,*n1);
返回(*m1>*n1);
}
ANSI C规范将长度定义为至少4个字节(32位),但GCC在您的情况下将长度定义为8个字节。它是特定于体系结构的,因此如果需要特定的大小,您需要使用sizeof(long)或uint32\u t或int32\u t等C99类型之一。您确定long是4字节吗?最好使用sizeof(long)而不是硬编码good point。我试试看。一秒钟,冒泡排序不就是简单的交换吗?你为什么要处理记忆?这就是问题所在。谢谢你的帮助。noMAD:我需要编写一个适用于所有数据类型的bubble()函数。有没有不使用memcpy的方法?似乎这需要为每种数据类型添加不同的复制/交换函数。这就做到了。谢谢你的帮助。
#include <stdio.h>
#include <string.h>
#define MAX_BUF 256
long arr[10] = { 3,6,1,2,3,8,4,1,7,2};
char arr2[5][20] = { "Mickey Mouse",
"Donald Duck",
"Minnie Mouse",
"Goofy",
"Pluto" };
void bubble(void *p, int width, int N, int(*fptr)(const void *, const void *));
int compare_string(const void *m, const void *n);
int compare_long(const void *m, const void *n);
int main(void) {
int i;
puts("\nBefore Sorting:\n");
for(i = 0; i < 10; i++) { /* show the long ints */
printf("%ld ",arr[i]);
}
puts("\n");
for(i = 0; i < 5; i++) { /* show the strings */
printf("%s\n", arr2[i]);
}
bubble(arr, 4, 10, compare_long); /* sort the longs */
bubble(arr2, 20, 5, compare_string); /* sort the strings */
puts("\n\nAfter Sorting:\n");
for(i = 0; i < 10; i++) { /* show the sorted longs */
printf("%d ",arr[i]);
}
puts("\n");
for(i = 0; i < 5; i++) { /* show the sorted strings */
printf("%s\n", arr2[i]);
}
return 0;
}
void bubble(void *p, int width, int N, int(*fptr)(const void *, const void *)) {
int i, j, k;
unsigned char buf[MAX_BUF];
unsigned char *bp = p;
for(i = N - 1; i >= 0; i--) {
for(j = 1; j <= i; j++) {
k = fptr((void *)(bp + width*(j-1)), (void *)(bp + j*width));
if(k > 0) {
memcpy(buf, bp + width*(j-1), width);
memcpy(bp + width*(j-1), bp + j*width , width);
memcpy(bp + j*width, buf, width);
}
}
}
}
int compare_string(const void *m, const void *n) {
char *m1 = (char *)m;
char *n1 = (char *)n;
return (strcmp(m1,n1));
}
int compare_long(const void *m, const void *n) {
long *m1, *n1;
m1 = (long *)m;
n1 = (long *)n;
printf("m1 = %l and n1 = %l\n", *m1, *n1);
return (*m1 > *n1);
}