2011-03-18 53 views
6

建議我使用指針添加一個我想從某個現有函數傳遞給另一個函數的向量。我真的被困在如何獲得信息回雖然。我已經嘗試了很多我在這裏和那裏閱讀的內容,所以讓我演示一下我在說什麼。通過指針傳遞函數之間的向量

主要程序:

std::vector<float> * dvertex=NULL; 

track.calculate(irrelevant stuff, dvertex) 

二次程序(軌道計算)

track::caclulate(irrelevant stuff, vector<float> * dvertex) 
{ 
... 
vector<float> pos; 
... pos filled after some calculations 
if(! (dvertex==NULL)) 
{ 
    dvertex = &pos1; 
} 

回主,除非我搞砸了的東西上面,這裏的一些事情,我已經試過

(*dvertex).at(0) 
float z = (*dvertex).at(0) 
(*dvertex)[0] 

和一堆東西,只是普通沒有編譯。我很困難,因爲我不確定如何從主程序中獲取特定值。我甚至認爲它可能是if(!(dvertex == NULL))位,所以我將它改爲if(dvertex == NULL)但仍然沒有喜悅。任何幫助將不勝感激。

* 編輯/更新 *非常感謝所有人的幫助,但我擔心我仍然在做錯。

所以下面我只是傳遞一個參考的建議:我這樣做:

主要

std::vector<float> dvertex; 
track.calculate(foo, &dvertex); 

二次保持不變(與空檢查!)

主要

std::cout<<dvertex[0]<<std:endl; 

(以及其他實際使用數據的嘗試)

非常感謝任何關於我仍然不正確行事的想法。所有東西都編譯完成後,程序在達到使用dvertex的數據時就凍結了。

編輯:最終修復

在二級程序,我需要

*dvertex = pos1; 

,而不是

dvertex = &pos1; 
+3

不要在你投入更多的建議,但你應該把它作爲一個參考。那麼就沒有必要解除引用任何東西,並且獲得所有相同的好處。 – jonsca 2011-03-18 04:31:29

+0

@jonsca是對的,你應該做一些像track :: caclulate(不相關的東西,矢量&dvertex),然後就像把dvertex當成一個普通向量一樣簡單,並且用它做的工作仍然可以在方法外部使用。 – 2011-03-18 04:35:46

+1

有時我喜歡通過指針傳遞,如果容器將被修改。在通常需要使用地址運算符的調用地址:'func(&my_vertor);'這是一個小提醒,表明該函數實際上修改了容器。如果您始終按引用傳遞,則無需查看函數聲明即可區分修改和非修改調用。但是,這純粹是一種風格問題,沒有性能優勢。 – dappawit 2011-03-18 04:52:21

回答

10

我不知道爲什麼這些沒有編譯你,因爲只要指針有效且不爲空,它們就是有效的:

void f(std::vector<int>* v) 
{ 
    if(v != 0) { 
     int n = (*v)[0];  // ok 
     int m = (*v).at(0); // ok 
     int o = v->at(0); // ok 
    } 
} 

但是沒關係。如果您必須更改矢量,請使用引用;如果不是,請使用常量引用。很少有時候需要通過指針來取容器。

另外,我建議你查一下對0,不NULL指針,因爲有時NULL被定義爲(void*)0按C編譯器。但有些人可能會在這裏辯論。

+0

C編譯器可能會將NULL定義爲'(void *)0',但是C編譯器≠C++編譯器。符合的C++編譯器必須將NULL定義爲「實現定義的C++空指針常量」(C++ 03標準§18.1/ 4)。由於0也是一個有效的空指針常量,因此沒有技術上的理由來選擇0或NULL--選擇純粹是文體。我個人比較喜歡NULL,因爲它明確表達了你正在處理一個指針,而對於0來說,從上下文來看不論你是處理整數還是指針。 – 2011-03-18 04:59:28

+0

我更喜歡NULL的檢查,它在視覺上更加獨特(等待nullptr) – 2011-03-18 05:13:55

+0

@AdamRosenfield如果0不是實現定義的並且爲NULL,那麼這不是一個足夠好的技術原因來選擇0而不是NULL嗎? – wilhelmtell 2011-03-18 05:19:33

2

見我注意上面,但是對於您的方案的工作,你需要std::vector<float> * dvertex=NULL;std::vector<float> * dvertex = new std::vector<float>();

3

如果你要修改的向量,你可能只是想通過引用傳遞它。如果你使用一個指針,不過,你需要定義主要載體,然後傳遞向量地址:

void calculate(std::vector<float> *vertex_array) { 
    vertex_array->pushback(1.0f); 
    vertex_array->pushback(2.0f); 
} 

int main() {  
    std::vector<float> vertexes; 
    calculate(&vertexes); 

    std::copy(vertexes.begin(), vertexes.end(), 
     std::ostream_iterator<float>(std::cout, "\n")); 
    return 0; 
}