错误 r6002 浮点支持未加载?

问题描述 投票:0回答:1

我正在 Windows 8 中的 Visual Studio 2010 中工作。在我的程序的某个时刻,当尝试从文件中读取数字作为浮点数时,我收到错误 r6002 浮点支持未加载。 我找不到解决的方法。请帮忙。 这是代码

while(fgets((char *)pucLine, 512, fp[i]) != NULL)
{
    float fvals[8] ;                
    int res ;               
    res = sscanf_s((char *)pucTmp, "%f%f%f%f%f%f%f%f",
            &fvals[0],&fvals[1],&fvals[2])&fvals[3],&fvals[4],&fvals[5],  &fvals[6],&fvals[7]);           
c++ visual-studio-2010
1个回答
0
投票

最简单的修复方法是以涉及浮点常量的方式初始化 fval。例如,将声明更改为:

float fvals[8] = {0.0};

Visual Studio 2013 及更高版本中不需要此修复。

在 Visual Studio 的早期版本(直至 Visual Studio 2012)中,scanf 和相关函数(例如您在此处使用的 sscanf_s)默认情况下不包含将浮点数的字符串表示形式转换为所需的浮点代码二进制浮点表示。相反,执行此任务的代码位于浮点库组件中,如果编译器指示链接器这样做,则链接器会将其包含在程序可执行文件中。如果编译器确定需要浮点代码,则会将符号 _fltused 包含在要由链接器解析的符号列表中。这会导致链接器将浮点代码包含在可执行文件中。

简单地声明一个未初始化的浮点变量,获取其地址,并将其传递给主要不是浮点函数的函数(例如 scanf),不足以导致编译器发出 _fltused 符号。在运行时,如果 scanf 或相关函数需要调用浮点代码,但发现该代码不存在,则会生成运行时错误 R6002“浮点支持未加载”并终止程序。使编译器发出 _fltused 符号所需要做的就是在程序中包含某种浮点运算,例如我上面建议的浮点变量的初始化。

在 Visual Studio 2013 及更高版本中,scanf 和相关函数默认包含将字符串转换为浮点数所需的浮点代码,因此您的程序中不会出现 R6002 错误,并且不需要我建议的修复。 (顺便说一句,编译器仍然使用涉及 _fltused 的机制。您可以通过从 Visual Studio 命令提示符运行 dumpbin /symbols 并将编译后的目标文件的名称传递给它来查看编译器是否已发出 _fltused我不确定 _fltused 对现代版本的链接器有什么影响。)

以下文章提到 _fltused 如何影响旧版本链接器的行为:

理解经典的链接模型:带着符号一起走 https://devblogs.microsoft.com/oldnewthing/20130108-00/?p=5623

为了完整起见,我将指出您发布的代码中的两个小错误。传递给 sscanf_s 的目标缓冲区指针应该是 pucLine,而不是 pucTmp。在 sscanf_s 参数列表中,&fvals[2] 后面应该跟一个逗号,而不是圆括号。

© www.soinside.com 2019 - 2024. All rights reserved.