2014-07-16 210 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*您數組標識符。

相關問題