2014-09-24 69 views
0

我想用兩個(​​實際上更多,但並不重要)源代碼編譯代碼。在其中的一個我聲明的變量大小的數組像這樣:在C++源文件之間共享動態分配的數組

const int number_of_equidistant = spike_location[number_of_spikes-1]; 
point_type* equidistant = NULL; 
equidistant = new point_type[number_of_equidistant]; 

它工作正常,只要我只有在我宣佈它相同的源文件中使用它。然而,我想在其他地方訪問它(在這一點上只是打印出來的內容來檢查它做它應該做什麼),這就是動態大小導致問題的地方(我試圖聲明大小爲extern const int但那不起作用)。有沒有解決方法,或者這是一個特別愚蠢的方法,並應該以某種方式不同?

的具體錯誤報告是這樣的:

debug.cpp: In function ‘void debug_initialization()’: 
debug.cpp:71:56: error: storage size of ‘equidistant’ isn’t constant 
extern point_type equidistant[number_of_equidistant]; 

在debug.cpp,數組和大小聲明如下:

extern const int number_of_equidistant; 
extern point_type equidistant[number_of_equidistant]; 

我當然可以將其更改爲一個列表(或堆或類似的東西),但我寧願能夠通過索引輕鬆訪問數據。任何其他做法超出了我的知識,所以我歡迎,你正在使用

extern point_type equidistant[number_of_equidistant]; 

任何建議:)

+0

這是一個全局變量,或函數中的變量? – 2014-09-24 20:24:51

+0

爲什麼不使用像'std :: vector'這樣明智的集合? – 2014-09-25 08:48:12

+0

大衛:我可能會去。 gnat:抱歉張貼在一個錯誤的組。到目前爲止,我只使用了math.stackexchange。 – Trademark 2014-09-27 17:59:27

回答

0

當你用新的分配,你總是使用指針後,你應該使用

extern point_type* equidistant; 

a.cpp:

#include <iostream> 

extern const int number_of_equidistant; 
extern double* equidistant; 
extern void debuginit(); 

int main() 
{ 
    debuginit(); 
    for(size_t ii=0; ii<number_of_equidistant; ii++) { 
     std::cerr << ii << std::endl; 
    } 
} 

b.cpp:

extern const int number_of_equidistant = 100; 
double equidistant[number_of_equidistant]; 

void debuginit() 
{ 
    for(int ii=0; ii<number_of_equidistant; ii++) 
     equidistant[ii] = ii; 
} 

我建議你使用矢量代替。它纔有意義存儲長度和指針一起,尤其是對於一個全球性的:

我在a.cpp:

#include <vector> 

const int number_of_equidistant = 100; 
std::vector<double> equidistant(number_of_equidistant); 

void debuginit() 
{ 
    for(int ii=0; ii<equidistant.size(); ii++) 
     equidistant[ii] = ii; 
} 

和b.cpp:

#include <vector> 
#include <iostream> 

extern std::vector<double> equidistant; 
extern void debuginit(); 

int main() 
{ 
    debuginit(); 
    for(size_t ii=0; ii<equidistant.size(); ii++) { 
     std::cerr << ii << std::endl; 
    } 
} 

會最好在main()中聲明你的變量,然後根據需要傳遞它,因爲如果你知道它來自哪裏(參數列表),而不是一些你不知道的全局變量其他人已修改。

+0

謝謝,這個幫助很大! – Trademark 2014-09-27 17:57:59

1

你必須是一致的:

point_type* equidistant = NULL; 

這是說equidistant是一個指針。

extern point_type equidistant[number_of_equidistant]; 

這就是說equidistant是一個數組。挑一個並堅持下去。