有人建议我使用指针添加一个我想从一些现有函数传递给另一个函数的向量。我真的被困在如何获取该指针 out 的信息。我已经尝试了很多我在这里和那里读过的东西,所以让我展示一下我在说什么。
主要计划:
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;
}
回到小学,除非我弄乱了上面的内容,这里有一些我尝试过的东西
1
(*dvertex).at(0)
float z = (*dvertex).at(0)
2
(*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;
答案 0 :(得分: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
}
}
但别介意。如果必须更改向量,请使用引用;如果不能,则使用const引用。很少需要用指针来取一个容器。
此外,我建议您检查针对0
的指针,而不是NULL
,因为根据C编译器,有时NULL
被定义为(void*)0
。但有些人可能会在这里反驳。
答案 1 :(得分:3)
如果您要修改矢量,您可能只想通过引用传递它。但是,如果使用指针,则需要在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;
}
答案 2 :(得分:2)
请参阅上面的说明,但要使您的方案有效,您需要std::vector<float> * dvertex=NULL;
为std::vector<float> * dvertex = new std::vector<float>();