2013-10-01 24 views
1

它執行兩個塊的字典對比。我測試我的 程序使用各種類型的塊。 字符的測試都是商品。 第一個測試不好,因爲好的答案是0,但現在是1. 第二個測試是好的(1 == 1) 第三個測試是好的(-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; 
} 
+0

也許'int -1'在'int compare_ints()'中? – chux

+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; 
     } 
    } 
+0

謝謝@chux。沒關係 –