2011-03-18 95 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; 
} 
相关问题