将向量转换为数组问题

Posted

技术标签:

【中文标题】将向量转换为数组问题【英文标题】:converting vector to array problems 【发布时间】:2011-11-05 02:11:58 【问题描述】:

我有全局变量:

point4 * mypoints;
color4 * mycolors;

还有一段代码是函数drawPlyFiles的一部分

vector<point4> retpolys;
retpolys.resize(polynum * 3);
GLint polyx, polyy, polyz;
for (int i = 0; i < polynum; i++)

    inStream >> polyx;
    inStream >> polyx >> polyy >> polyz;
    //cout << "x: " << polyx << " y: " << polyy << " z: " << polyz << "\n";
    retpolys[i*3] = retVerts[polyx];
    retpolys[(i*3) + 1] = retVerts[polyy];
    retpolys[(i*3) + 2] = retVerts[polyz];
    //retpolys[i] = point4( polyx, polyy,  polyz, 1.0 );


mypoints = &retpolys[0];
return true;

从代码中删除的重要部分是我将全局 mypoints(array) 设置为等于 retpolys(vector)。 Retpolys 被来自 for 循环的数据填充。当我调试时,retpolys 中的所有数据都很好。 (retVerts 是point4的向量)

稍后在我的主初始化函数中运行:

drawPlyFile("ply_files/airplane.ply");
//colorcube();
point4 temp = mypoints[1];
int thissize = sizeof(mypoints)/sizeof(mypoints[0]);
for (int i = 0; i < thissize; i++)

    mycolors[i] = color4( 0.0, 0.0, 0.0, 1.0 );

代码编译得很好,但我有一个运行时异常。我调试以发现问题。我在 drawPlyFiles 之后检查了 mypoints 的值,看起来它只包含一个指向 retpolys 开始位置的指针。但是,当我调试时,它不允许我查看数组的其他部分,只是第一个指针。(当我在函数中时,我可以看到 retpolys 的所有单独值)然后我检查这个大小的值,然后我得到一个像 -12894161 这样的数字,这没有意义,因为它应该是 mypoints 的大小。

我认为问题在于从 retpolys 到 mypoints 的转换,但我不知道如何修复它,或者即使那是错误的实际原因。有什么帮助吗?

附言我希望 mycolors 具有与 mypoints 相同数量的元素,并且所有 em 都是 color4( 0.0, 0.0, 0.0, 1.0 )

【问题讨论】:

【参考方案1】:

以下行不正确:

mypoints = &retpolys[0];

在这里,您将指针指向一个向量的内容,该向量在您退出函数时会自动销毁。矢量析构函数将释放这块内存,使您的全局变量指向一个已释放的内存空间。

您应该进行实际的内存分配并复制内容。

【讨论】:

我从***.com/questions/2923272/…得到了方法。但是你说的是向量在函数退出时被释放,所以指针不是向量的开始,而只是内存中一个没有意义的位置。你是什​​么意思进行实际的内存分配?你的意思是我应该让函数返回向量并在全局空间中进行转换? 你可以按照 Robin 上面的建议做,让“mypoints”成为一个实际的向量而不是指针。它将简化您的代码和内存管理:“std::vector mypoints;”。然后,在 drawPlyFile 中:“mypoints = retpolys;”。虽然这是一个建议,但您可能会受到限制,导致此示例无法使用。【参考方案2】:

你没有设置任何数组等于任何东西;你只是存储一个指向向量第一个元素的指针;当向量超出范围时,这将不再有效。

确实,mypoints 不是数组

为什么不只保留矢量?当您需要一个指针(可能传递给第 3 方图形 API)时,您可以在最后一刻完成。

【讨论】:

【参考方案3】:

在 C++ 中,当你像这样声明一个变量时:

vector<point4> retpolys;

它的存储类是自动的。这意味着当范围声明变量时,用于保存内容的内存会自动释放(如果它是一个类,则调用析构函数)。在您的情况下,这意味着当 drawPlyFiles 函数结束时, retpolys 内容被释放。您通过返回指向向量中第一个值的指针巧妙地解决了这个问题。但这行不通——内容已被释放。即使它有时有效,但它是不正确的。

您真正想做的是自己为 retpolys 分配内容。这不是让编译器根据范围设置内存,而是使用 new 运算符来分配它。例如:

vector<point4> *retpolys = new vector<point4>;

在引用 retpolys 时,您需要更改函数其余部分的语法。

【讨论】:

以上是关于将向量转换为数组问题的主要内容,如果未能解决你的问题,请参考以下文章

将数组转换为向量的最简单方法是啥?

将 NumPy 向量转换为二维数组/矩阵

将字符串向量转换为双二维数组向量

将二维向量转换为二维数组

将c多维数组转换为多维c++向量

将向量转换为数组问题