C 冒泡故障

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]={“米老鼠”, “唐老

gcc编译以下代码时没有错误。我正在创建一个冒泡排序函数,它可以用于任何数据类型的数组(因此是函数指针)

它对字符串数组(arr2)进行排序没有问题,但是,我不明白为什么它不能对整数数组(arr)进行正确排序。我在compare_long函数中添加了printf语句,以查看发生了什么。看起来整数没有被正确地传递给它。任何帮助都将不胜感激


#包括
#包括
#定义最大值为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);
    }