将值从浮点数组传递到双精度数组时的奇怪行为(C, c++)
Strange behaviour when passing values from a float array to a double array (C, C++)
我正在开发一个使用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 -∞。你从双精度得到了什么当双精度数的值太大而无法进行浮点转换时
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '