通过指针在函数之间传递向量

sha*_*era 6 c++ pointers vector

有人建议我使用指针添加一个我想从一些现有函数传递给另一个函数的向量.我真的很困惑如何该指针中获取信息.我已经尝试了很多我在这里和那里读过的东西,所以让我展示一下我在说什么.

主要课程:

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

track.calculate(irrelevant stuff, dvertex)
Run Code Online (Sandbox Code Playgroud)

二级程序(跟踪,计算)

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

回到小学,除非我弄乱了上面的东西,这里有一些我尝试过的东西

1

(*dvertex).at(0)
float z = (*dvertex).at(0)
Run Code Online (Sandbox Code Playgroud)

2

(*dvertex)[0]
Run Code Online (Sandbox Code Playgroud)

和一堆简单的东西没有编译.由于我不确定如何在主程序中从该向量中获取特定值,所以我很困惑.我甚至认为它可能是if(!(dvertex == NULL))位,因此我将其更改为if(dvertex == NULL)但仍然没有快乐.任何帮助将不胜感激.

*编辑/更新*非常感谢大家的帮助,但我担心我仍然做错了.

所以按照我刚刚传递参考的建议:我这样做了:

std::vector<float> dvertex;
track.calculate( foo, &dvertex);
Run Code Online (Sandbox Code Playgroud)

二级保持不变(有!空检查)

std::cout<<dvertex[0]<<std:endl; 
Run Code Online (Sandbox Code Playgroud)

(以及实际使用数据的其他尝试)

非常感谢您对我仍然做得不正确的想法.一切都编译好,当程序达到使用dvertex数据的程度时,程序就会冻结.

编辑:最终修复

在我需要的二级课程中

*dvertex = pos1;
Run Code Online (Sandbox Code Playgroud)

代替

dvertex = &pos1;
Run Code Online (Sandbox Code Playgroud)

wil*_*ell 11

我不确定为什么这些没有为你编译,因为只要指针有效且不为null它们就是有效的:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

但别介意.如果必须更改向量,请使用引用;如果不能,则使用const引用.很少需要通过指针来获取容器.

另外,我建议您检查指针0,而不是NULL,因为有时NULL定义(void*)0为每个C编译器.但有些人可能会在这里反驳.


Jer*_*fin 6

如果您要修改向量,您可能只想通过引用传递它。但是,如果确实使用指针,则需要在 main 中定义一个向量,然后传递该向量的地址:

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;
}
Run Code Online (Sandbox Code Playgroud)