冒泡排序麻烦

时间:2012-04-27 04:56:01

标签: c debugging sorting pointers bubble-sort

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

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


    #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);
    }

1 个答案:

答案 0 :(得分:1)

ANSI C规范定义为4个字节(32位)的MINIMUM,但GCC在您的情况下定义为8个字节。它是特定于体系结构的,因此如果需要特定大小,则需要使用sizeof(long)或其中一种类似uint32_t或int32_t的C99类型。