我正在开发一个使用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()中声明的唯一数组是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) ;
然后你会得到一个编译器错误.