程序在clang中编译时有效,但在Windows中不是gcc

时间:2014-03-13 15:05:42

标签: c gcc clang

这个搜索功能在我使用clang在Linux上编译时有效,但在使用MinGW gcc的Windows上,我没有得到正确的答案。代码中包含一个数组,其中我正在寻找的数值显然在数组中。所以输出应该是#34;找到它!"。任何人都知道Windows会出现什么问题?

#include <stdio.h>
#include <stdbool.h> 


bool re_search(int value, int values[], int first, int last);

int main(void)
{
    int value = 12;
    int values[] = {2,4,5,12,23,34};
    int n = 6;
    if (re_search(value, values, 0, n-1))
    {
        printf("Found it!\n");
    }
    else
    {
        printf("Did not find it\n");
    }
    return 0; 
} 

bool re_search(int value, int values[], int first, int last)
{
    last = last-1;
    int middle = (first+last)/2;

    while (first <= last)
    {
        if (value == values[middle])
        {
            return true;
        }
        else if (value > values[middle])
        {
            first = middle + 1;
            middle = (first + last) / 2;
            return re_search(value, &values[middle], first, last);
        }    
        else
        {
            last = middle - 1;
            middle = (first + last) / 2;
            return re_search(value, &values[first], first, last);
        }    


    }
    return false;
}

2 个答案:

答案 0 :(得分:3)

你的递归调用return re_search(value, &values[middle], first, last);传入一个从中点开始的数组,以及从整个数组开始计算的新值first。你想做一个或另一个;不是两个。

也就是说,您先拨打:

values == {2,4,5,12,23,34}
first == 0
last == 5

在第一次迭代中,您尝试middle == 2,因此values[middle]为5,小于12.然后使用

递归
values == {12,23,34}
first == 3
last == 5

而且 - 亲爱的! - 即使values[first]现已超出范围。很有可能,在Linux上你得到(非)幸运并且在阵列结束时达到了你正在搜索的价值。

答案 1 :(得分:1)

无论是GCC还是Windows。

bool re_search(int value, int values[], int first, int last){
    if (first <= last){
        int middle = (first+last)/2;
        if (value == values[middle]){
            return true;
        } else if (value > values[middle]){
            return re_search(value, values, middle + 1, last);
        } else {
            return re_search(value, values, first, middle - 1);
        }
    }
    return false;
}

bool re_search(int value, int values[], int first, int last){
    while (first <= last){
        int middle = (first+last)/2;
        if (value == values[middle]){
            return true;
        } else if (value > values[middle]){
            first = middle + 1;
        } else {
            last = middle - 1;
        }
    }
    return false;
}