无法将'double (*)[10]'转换为参数的'double*'
cannot convert 'double (*)[10]' to 'double*' for argument
请帮忙解决编译时错误。我在不同的文件中有声明,如下所示
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
(动态大小)
这里有多个问题:
-
头文件中的签名和实现文件中的签名不一样:头文件将
posTime()
的最后一个参数声明为double*
类型(是的,指针,而不是数组!),而实现文件将其声明为double**
类型(再次,数组规范被转换为指针声明,因为它是函数参数声明)。结果是,实现声明了头文件中声明的函数的重载,而不是它的实现。
-
当你取一个数组的地址时,你得到一个指向数组的指针,即一个类型为
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*
- C++在数学计算中将double转换为int
- 错误:无法将"<lambda(double)>"转换为"double(*)(double)"
- 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
- 将 std::vector<boost::optional<double>> 转换为 std::vector<double>
- 将 double* 转换为 std::vector<double> (C++)
- 无法将复数<double>转换为双精度
- "double(*)(string, double, double)"尝试传递函数C++时"double"转换错误
- 从 double* 转换为 int 会失去精度
- 从'double'转换为'int'需要缩小转换范围
- 错误:无法将参数“1”的“double*”转换为“double”,错误:数组下标的类型“double[double]”无
- C 编译器从Double转换为INT
- 将“ double*”转换为“ boost :: Any*”
- 警告 C4244:'argument':从 'double' 转换为"浮点数",可能会丢失数据 - C++
- 当我使用模板时,编译器无法将函数的返回类型从 double 转换为 int
- 将double转换为LSBF(小Endian)十六进制字符串
- JNI在将Java double转换为jdouble时出现问题
- 无法将double转换为字符串
- 警告 C4244:"参数":从"double"转换为"int",可能会丢失数据
- C++无法将'long double'转换为'long double*',因为参数'1'为"long
- 在C++中,将double转换为long的类型返回了不正确的值