无法将'double (*)[10]'转换为参数的'double*'

cannot convert 'double (*)[10]' to 'double*' for argument

本文关键字:double 转换 参数      更新时间:2023-10-16

请帮忙解决编译时错误。我在不同的文件中有声明,如下所示

type.h
extern block posTime(const int row[MAX_ROW], int Flag, int n,double Time[]=0 );
a.cc
block posTime(   const int row[MAX_ROW],
                       int Flag,
                       int n,
                       double* eraseTime[]
                       )

eraseTime[0]=test[1];

.

b.cc
...
double eraseTime[MAX_ROW];
block newB = posTime (0,0,0,&eraseTime);

最后一行block newB = posTime (0,0,0,&eraseTime);给出了错误,cannot convert double (*)[10] to double* for argument 4

我想在a.cc中更新eraseTime,并在b.cc中使用。我可以这么做吗?

工作方案(GCC 4.9.0 with c++ 11)

test.hpp

#define MAX_ROW 10
extern double posTime(const int row[MAX_ROW], int Flag, int n,double Time[]=0 );

test1.cpp

#include "test.hpp"
double posTime(   const int row[MAX_ROW],
                       int Flag,
                       int n,
                       double* eraseTime
                       )
{ eraseTime[0] = 2; eraseTime[1] = 3; return eraseTime[0]; }

test.cpp

#include <iostream>
#include "test.hpp"
double eraseTime[MAX_ROW] { 1, 2, 3, 4, 5, 6 ,7, 8, 9, 10 };
int main() {
    double newB = posTime (0,0,0,eraseTime);
    std::cout << "result: " << newB << std::endl;
    for (auto v : eraseTime) {
        std::cout << v << std::endl;
    }
    return 0;
}

编译命令: g++化c++ 11 - o e: test.exe e: test.cpp e: test1.cpp

double eraseTime[MAX_ROW],如果您在int行中使用MAX_ROW,我不明白为什么不在中使用eraseTime(可能一些调用位置不在示例中限制此使用)或double* eraseTime

建议使用std::array(固定大小)或std::vector(动态大小)

这里有多个问题:

  1. 头文件中的签名和实现文件中的签名不一样:头文件将posTime()的最后一个参数声明为double*类型(是的,指针,而不是数组!),而实现文件将其声明为double**类型(再次,数组规范被转换为指针声明,因为它是函数参数声明)。

    结果是,实现声明了头文件中声明的函数的重载,而不是它的实现。

  2. 当你取一个数组的地址时,你得到一个指向数组的指针,即一个类型为double (*)[MAX_ROW]的值。这与double**不兼容,这就是编译器所抱怨的。要创建这种类型的变量,必须使用语法double (*myArrayPointer)[MAX_ROW];。括号很重要,因为数组下标操作符的优先级高于解引用操作符,因此double* myPointerArray[MAX_ROW];声明了一个由MAX_ROW指针组成的双精度指针数组。

如果要将数组作为指向数组的指针传递,则需要将函数声明为

extern block posTime(const int row[MAX_ROW], int Flag, int n,double (*Time)[MAX_ROW]=0 );

这样做的好处是可以对数组的长度进行类型检查,但缺点是不能接受动态大小的数组。如果需要这种灵活性,通常的方法是传递指向第一个元素的指针:

extern block posTime(const int row[MAX_ROW], int Flag, int n,double *Time=0 );

被称为

block newB = posTime (0,0,0,eraseTime);

调用依赖于数组指针衰减从你的数组标识符生成一个double*