枚举在Windows上有意想不到的价值但不是Linux

时间:2012-12-17 23:36:43

标签: c++ windows gcc enums

我无法在Windows上正常使用此功能。在linux上编译它会返回预期值,但在Windows上它会返回一些随机数。

typedef enum wezly {
    elektrownie1,
    konwencjonalne1,
    niekonwencjonalne1,
    weglowa1,
    jadrowa1,
    sloneczna1,
    wiatrowa1,
    geotermiczna1,
    gazowa1,
    wodna1,
    maremotoryczna1,
    maretermiczna1
};

wezly wybor_wezla(string opcja)
{
    string bb;
    bb = opcja;

    if ((bb.compare("[elektrownie]")==0)||(bb.compare("[ELEKTROWNIE]")==0))
        return elektrownie1;
    else if ((bb.compare("[konwencjonalne]")==0)||(bb.compare("[KONWENCJONALNE]")==0))
        return konwencjonalne1;
    else if ((bb.compare("[gazowa]")==0)||(bb.compare("[GAZOWA]")==0))
        return gazowa1;
    else if ((bb.compare("[wodna]")==0)||(bb.compare("[WODNA]")==0))
        return wodna1;
    // (and so on...)
}

int main()
{

    cout << wybor_wezla("[gazowa]");
}

在linux上我得到7,在windows上有一些随机数....

为什么会这样?

2 个答案:

答案 0 :(得分:3)

这实际上是在这里打破了(看了the link you gave in the comments之后):

  bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-1);

如果输入是“...... [无论如何] ......”,这会导致提取类似“[whateve”的字符串。

我认为你的意思是:

  bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-opcja.find_first_of("[")+1);

这导致从输入中提取类似“[whatever]”的字符串。

给定输入“[gazowa]”的原始代码将比较“[gazow”到各种字符串,none将匹配,并且将在不命中return语句的情况下到达函数的结尾。 / p>

这会导致未定义的行为。因此,当[gazowa]给你8时,你在linux上的结果为7,在windows上有其他一些值。

您还需要做一些更明智的事情来处理没有任何字符串匹配的情况,即如果达到wybor_wezla的结尾。在这种情况下你做的事情取决于你,但作为一个开始,我至少在那里放一个打印声明,以便你知道什么时候没有匹配。

答案 1 :(得分:1)

您的代码缺少最终的else子句:

wezly wybor_wezla(string opcja)
{
    if(...)
        return ...;
    else if(...)
        return ...;
    else if(...)
        return ...;
    // No final else!
}

如果if子句都不为真,则它会在不返回值的情况下从函数末尾开始,即未定义行为。在这种情况下,它返回垃圾值,但可能会发生更糟糕的事情。

您的第一个操作应该是添加最终else条款。这可以返回默认值,错误代码,抛出异常,abort()等,但不能做任何事情。如果你知道价值必须是一组有限的东西,你可以将最终的else if更改为else,并假设如果它不是第一个N-1的东西,它就是Nth事。

完成后,您需要弄清楚为什么您的数据不会落入预期的情况之一并修复它。