-1

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

为什么会这样?

4

2 回答 2

3

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

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

如果输入是“... [whatever] ...”,这将导致提取像“[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。在这种情况下你做什么取决于你,但作为开始,我至少会在其中放置一个打印语句,这样你就知道什么时候没有匹配。

于 2012-12-17T23:49:47.723 回答
1

您的代码缺少最后一个else子句:

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

当没有任何if子句为真时,它会从函数的末尾落下而不返回一个值,即Undefined Behavior。在这种情况下,它返回一个垃圾值,但可能会发生更糟糕的事情。

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

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

于 2012-12-17T23:59:33.470 回答