2014-07-16 175 views
1

请帮助解决编译时错误。我在不同的文件中声明,如下图所示无法将参数“double(*)[10]”转换为“double *”

​​

...

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双(*) [10]至double* for argument 4

我想上传在a.cc中使用eraseTime并在b.cc中使用。我可以这样做吗?

+1

'&'是运营商的地址。你得到的类型是一个指向你的地址类型的指针。指向数组的指针与指向数组元素的指针没有任何相容性。 – chris

+4

您要在'posTime'的签名中设置'double * eraseTime'或'double eraseTime []',而不是'double * eraseTime []'。 – hobbs

+0

'type.h'中的原型和'a.cc'中的定义不一样。 “时间”和“eraseTime”没有声明相同。 –

回答

0

工作溶液(GCC 4.9.0用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; 
} 

编译命令: 克++ -std = C++ 11 -oe:\ TEST.EXE E:\ TEST.CPP E:\ test1.cpp

double eraseTime[MAX_ROW],如果使用的是MAX_ROW在INT行我不明白为什么不在eraseTime(可能一些调用位置不在样本中限制此用途)或double* eraseTime

建议更改为使用std::array(恒定大小)或std::vector(动态大小)。

+0

:我改变了你的第一个选项。我没有看到任何编译时错误。但重点是我想更新a.cc中的eraseTime并在b.cc中使用。当我尝试在a.cc中更新时,eraseTime [0] = test [1];它给我一个运行时错误。不能我访问变量并更新它? – user2441289

+0

我认为在** posTime **中更新他的值? 'code updated' – NetVipeC

+0

是的,我编辑了描述。如上所示。 – user2441289

0

这里有多种问题:

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

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

  2. 当你获取一个数组的地址时,你会得到一个指向数组的地址i。即类型为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*您数组标识符。

相关问题