枚举在Windows上具有意想不到的价值,但在Linux上没有

enum has unexpected value on Windows but not Linux

本文关键字:但在 Linux 意想不到 Windows 枚举      更新时间:2023-10-16

我无法让枚举在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 上它是一些随机数......

为什么会这样呢?

它实际上在这里坏了(在查看您在评论中给出的链接后):

  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"与各种字符串进行比较,没有一个会匹配,并且将在不点击return语句的情况下到达函数的末尾。

这会导致未定义的行为。因此,你在 Linux 上的结果是 7,在 Windows 上是其他一些值,而[gazowa]应该给你 8。

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

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

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

if 子句都不为 true 时,它会从函数的末尾掉下来而不返回值,即未定义的行为。 在这种情况下,它返回一个垃圾值,但可能会发生更糟糕的事情。

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

完成此操作后,您需要找出为什么您的数据没有落入预期情况之一并修复它。

相关文章: