枚举在Windows上具有意想不到的价值,但在Linux上没有
enum has unexpected value on Windows but not Linux
我无法让枚举在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
的事情。
完成此操作后,您需要找出为什么您的数据没有落入预期情况之一并修复它。
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- strcpy 在 Windows 上编译,但在 Linux 上不编译
- 在 Windows 上编译错误 C2131 和 C3863,但在 Linux 上不编译错误
- pthread在Windows中比串行快,但在Linux中比串行慢
- FCGX_GetParam REQUEST_METHOD可以在Windows中使用,但在Linux中返回NULL
- 为什么我的文件/目录操作在Windows上工作正常,但在Linux上不能
- 我的程序在Windows机器上崩溃了,但在Linux上运行良好
- Mutex锁会在mingw中暂停程序,但在linux上不会
- C++程序在VS上运行平稳,但在Linux Mint上运行不畅
- Ostream Tellp在Windows上失败,但在Linux上没有失败
- 枚举在Windows上具有意想不到的价值,但在Linux上没有
- 我的程序在Windows上使用MSVC和G 编译器运行,但在Linux上不运行
- 分段错误(核心转储) - 代码在 VS 中有效,但在 Linux 终端中不起作用
- 为什么我的程序在Windows上运行良好,但在linux上运行不好
- 标识符"creal"未定义 - 在 Mac 上可见,但在 Linux 上看不到
- 代码在 CodeBlock 中工作,但在 Linux 中编译时会出现错误
- C/C++/ObjectiveC之间的内存差异,程序在 codepad.org 崩溃,但在Linux上不会崩溃
- C++输出到Windows终端使用cout<<term_cc<color,default,attrib>在Windows上正确输出颜色和属性,但在Linux上不能
- 运算符>>在Visual C++ 2010中工作,但在Linux上不能使用G++。
- 可移植编程——在Win32上链接失败,但在linux上链接失败