两个街区的字典比较

时间:2013-10-01 23:16:35

标签: c pointers comparison block

执行两个块的字典比较。我测试我的 程序使用各种类型的块。 字符测试都是商品。 第一个测试不正常,因为好的答案是0,但现在是1。 第二次测试没问题(1 == 1) 第三个测试是ok(-1 == -1) 帮助我进行第一次测试。 感谢

这是我的代码:

    int compare_ints(const void* v1, const void* v2) {
    int *a = (int*)v1;
    int *b = (int*)v2;

    if (*a == *b) return 0;
    else if (*a > *b) return 1;
    else return -1;
}

int compare_gen(const void *block1, const void *block2,
        size_t elem_size, size_t block1size, size_t block2size,
        int (*compare_it)(const void*, const void*)) {
    int i = 0;
    int result = -2;

    if ( elem_size == sizeof(char) )
    {
        while ( i < block1size && i < block2size)
        {
            result = (*compare_it)((&((char*)block1)[i]),(&((char*)block2)[i]));
            if ( result == 0)
            {       
                i++;
            }
            else if ( result == -1 || result == 1 )
            {

                return result;
            }
        }
        if ( result == 0 )
        {
            if (i == block1size && i == block2size)
            {
                return result;
            }
            else if (i != block1size && i == block2size)
            {
                result = -1;
                return result;
            }
            else
            {
                result = 1;
                return result;
            }
        }
    }
    else if (elem_size == sizeof(int))
    {
        while ( i < block1size && i < block2size)
        {
            result = (*compare_it)((&((int*)block1)[i]),(&((int*)block2)[i]));
            if ( result == 0)
            {
                i++;
            }
            else if ( result == -1 || result == 1 )
            {
                return result;
            }
        }
        if ( result == 0 )
        {
            if (i == block1size && i == block2size)
            {
                return result;
            }
            else if (i != block1size && i == block2size)
            {
                result = -1;
                return result;
            }
            else
            {
                result = 1;
                return result;
            }
        }
    }
    return result;
}

int main()
{
    int array1 [10] = {10};
    int array2 [10] = {10};
    int array3 [10] = {10};
    int array4 [9] = {10};
    int i;

    for (i = 0; i < 10; i++) {
        array1[i] = 10;
        array2[i] = 10;
        array3[i] = 10;
        if (i < 9) array4[i] = 10;
    }
    array3[5] = 9;

    // First test
    int result = compare_gen(array1, array2, sizeof(int), sizeof(array1), sizeof(array2), (&compare_ints)); 
    printf("1 --> %d\n",result);
    // Second test
    result = compare_gen(array1, array3, sizeof(int), sizeof(array1), sizeof(array3), (&compare_ints));
    printf("2 --> %d\n",result);
    // third test
    result = compare_gen(array1, array4, sizeof(int), sizeof(array1), sizeof(array4), (&compare_ints));
    printf("3 --> %d\n",result);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

索引超出范围

while()中,只要使用blockXsize,就应将其替换为blockXsize/elem_size。完成此操作后,i将索引其适当的范围。此外,不需要if ( elem_size == ...。其他简化也是可能的。

if (1)
{
    while ( i < block1size/elem_size && i < block2size/elem_size)
    {
        //result = (*compare_it)((&((int*)block1)[i]),(&((int*)block2)[i]));
        result = (*compare_it)(
            (&((char*)block1)[i*elem_size]),
            (&((char*)block2)[i*elem_size]));
        if ( result == 0)
        {
            i++;
        }
        else if ( result == -1 || result == 1 )
        {
            return result;
        }
    }
    if ( result == 0 )
    {
        if (i == block1size/elem_size && i == block2size/elem_size)
        {
            return result;
        }
        else if (i != block1size/elem_size && i == block2size/elem_size)
        {
            result = -1;
            return result;
        }
        else
        {
            result = 1;
            return result;
        }
    }