将值从浮点数组传递到双精度数组时的奇怪行为(C, c++)

Strange behaviour when passing values from a float array to a double array (C, C++)

本文关键字:数组 c++ 双精度      更新时间:2023-10-16

我正在开发一个使用NI-DAQ的应用程序,下面是提供商提供的一些方法。

void someMethod(Calibration *cal, float myArray[], float result[]) 
{
    newMethod(&cal->rt,myArray,result,cal->cfg.TempCompEnabled);
}
void newMethod(RTCoefs *coefs, double myArray[],float result[],BOOL tempcomp) 
{
float newMyArray[6];
    unsigned short i;
    for (i=0; i < 6; i++) 
    {
         newMyArray[i]=myArray[i];
    }
}

我基本上调用someemethod(),为myArray[]和result[]提供一个包含六个元素([6])的数组。正如你在代码中看到的那样,之后newMethod()被调用,float myArray[6]被传递给double myArray[]参数(我真的不明白为什么这段代码的开发人员选择使用double数组,因为newMethod()内部声明的唯一数组是float类型)。

现在我的问题来了:在for循环中,一些值传递没有任何问题,但是当第四个和第五个值传递给newMyArray[]时,它收到"-1"。#INF0000"。乍一看,我以为它会是一些垃圾值,但是"-1"。#INF0000"在每次执行时都存在。

我知道C语言有时会很棘手,但我真的不知道为什么会发生这种情况…

newMethod的第二个参数类型为double *。但是你传递给它一个类型为float *的值

在c++中,或者在C中,如果有newMethod的原型在作用域中,这一定会产生编译错误。指针类型之间没有隐式转换,void *除外。

然而,在C中,如果范围内没有原型,那么你可能不会得到警告;只是在运行时未定义的行为,因为函数调用时使用的参数类型不同(在默认参数提升之后)。

如果在作用域中存在newMethod的非原型声明,则不会得到警告;如果根本没有声明,那么在C89中代码是合法的(即警告是可选的),但在C99中必须警告没有声明就调用了newMethod

(所以这是一个C程序还是c++程序是很重要的)

如果你用的是C语言,却没有收到任何警告,那就在这之前添加一个原型:

void newMethod(RTCoefs *coefs, double myArray[],float result[],BOOL tempcomp) ;

问题在于类型和数组在传递给函数时衰减为指针的事实。因此,当您将指向float数组的指针传递给someMethod时,它反过来将指向double数组的指针传递给newMethod。正如你(应该)知道float的大小和double的大小是不一样的,所以在newMethod的代码是从初始(float)数组中读取数据越界,导致未定义的行为

-1.#INF0000,我相信,是MSC的代表A -∞。你从双精度得到了什么当双精度数的值太大而无法进行浮点转换时