我正在使用一个库将Wavefront .obj文件加载到我的OpenGL应用程序(tinyobjloader)中。我注意到加载对象时出错。当我加载一个坐标为例如的对象时。 0.9999999它被设置为0.通过调试我发现以下方法产生这种行为:
static inline float parseFloat(const char*& token)
{
token += strspn(token, " \t");
float f = (float)atof(token);
token += strcspn(token, " \t\r");
return f;
}
所以atof()以某种方式返回一个int,而不是一个float。我读到一些编译器在使用atof()而不包含“stdlib.h”时不会发出警告,结果是atof()返回一个整数。
奇怪的是,即使我包含“stdlib.h”,错误仍然存在。我无法弄清楚导致这种行为的原因。
有什么想法吗?
答案 0 :(得分:2)
标准对此说:
除了出错的行为外,它相当于 的strtod(NPTR,(焦炭**)NULL)
所以你的回复'0'与浮动无法代表它或类似的东西无关。
你会使用strtod(你可能应该在stringstreams不是一个选项时,只是为了能够报告错误),那么你可能会注意到它停止在.
解析。
这强烈表明您正在使用等待,
而不是.
作为小数点分隔符的区域设置。根据应用程序如何使用区域设置,您可能希望使用正确设置的环境变量(例如LC_NUMERIC=C
)运行它,或者在进行任何解析之前自己执行setlocale(LC_NUMERIC,"C");
。
在任何情况下,您都应该分析应用程序中的哪些人正在使用与语言环境相关的内容,以及为什么不与它们发生冲突。另一种可能的途径是在任何地方都需要依赖于语言环境的输入,因此每个人都需要以,
作为小数分隔符给出数字。
答案 1 :(得分:0)