将值从float数组传递给double数组时的奇怪行为(C,C++)

 手机用户2602903375 发布于 2023-01-07 15:49

我正在开发一个使用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语言有时会很棘手,但我真的不知道为什么会这样......

1 个回答
  • 第二个参数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) ;
    

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

    2023-01-07 15:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有