1

我正在开发一个使用 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];
    }

}

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

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

我知道 C 语言有时会很棘手,但我真的不知道为什么会这样……

4

3 回答 3

6

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

在 C++ 中,或者在 C 中,如果存在newMethod范围内的原型,则必须生成编译错误。指针类型之间没有隐式转换,除了void *.

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

如果存在范围内的非原型声明,newMethod则不会收到警告;如果根本没有声明,那么在 C89 中代码是合法的(即警告是可选的),但在 C99 中,它必须警告newMethod在未声明的情况下调用。

(因此,这是 C 程序还是 C++ 程序很重要)。

如果您在 C 中并且没有收到任何警告,请在所有这些之前添加一个原型:

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

然后你会得到一个编译器错误。

于 2014-06-26T08:49:03.457 回答
3

问题在于类型以及数组在传递给函数时会衰减为指针的事实。因此,当您将指向float数组的指针someMethod依次传递给它时,将其作为指向 to 数组的指针double传递newMethod。并且您(应该)知道的大小float和大小不一样double,因此在newMethod代码中从您传递的初始 () 数组中读取越界数据,float这会导致未定义的行为

编译器应该已经给你警告了。

于 2014-06-26T08:39:17.943 回答
0

-1.#INF0000是,我相信,负无穷大的 MSC 表示。当双精度值太大而无法以浮点数表示时,这就是从双精度到浮点转换所得到的结果。

于 2014-06-26T08:37:48.883 回答