【问题标题】:enum has unexpected value on Windows but not Linuxenum 在 Windows 上具有意想不到的价值,但在 Linux 上没有
【发布时间】:2012-12-17 23:36:42
【问题描述】:

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

为什么会这样?

【问题讨论】:

  • 返回哪个号码?
  • 你在(an so on...) 中做了一些奇怪的事情。您能否发布一个自包含、完整但最小的示例来实际演示该问题?如,如果您的 enum 值较少,问题是否仍然存在?如果是这样,请删除它们并进行测试,直到它以最少数量的enum 值(以及最小大小的链式if 块)sscce.org
  • 它应该是 7,但在 Windows 上它会做一些奇怪的事情
  • @user1902400 什么是“奇怪的东西”?
  • 为什么是 typedef?它看起来不像你的类型定义枚举到任何东西?

标签: c++ windows gcc enums


【解决方案1】:

这里居然坏了(看了the link you gave in the comments之后):

  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 语句的情况下到达函数的末尾。

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

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

【讨论】:

  • 它不会改变输出,我在windows上编译时仍然得到像976868这样的随机数,它在linux上仍然正确
  • @user1902400 ideone.com/nWNJ7a - 如果给定您检查的字符串之一,似乎可以工作
  • 这就是我的观点。它在 linux 上运行良好,但在 windows 上却失败了……这是我一直以来唯一的问题
  • @user1902400:你需要更仔细地阅读这个答案——你的 Linux 运行并没有给你期望的答案。
【解决方案2】:

您的代码缺少最后一个 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 事物。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2021-08-17
    • 1970-01-01
    • 2019-02-23
    • 2017-10-16
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多