gpt4 book ai didi

c++ - 访问存储在 vector 中的指针的值

转载 作者:行者123 更新时间:2023-11-28 06:18:44 24 4
gpt4 key购买 nike

我正在尝试创建一个三角形网格来为有限元分析编写代码。我知道已经编写了软件来执行此操作,但这是针对类项目的。

我要做的是获取区域并将其划分为均匀间隔的节点(网格点)。每个节点有 6 个连接到它的三角形,需要在计算中使用。为了使事情更简单,我创建了两个结构,一个用于节点,一个用于三角形。

下面是我尝试在我的代码中实现的最小工作示例。但是,此代码在将 x,y 值分配给顶点的行上收到段错误。 gdb 状态中产生的错误:

With using vectors (as per the minimum working example)
----------------------------
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400f90 in std::vector<Node*, std::allocator<Node*> >::operator[] (this=0x0, __n=0)
at /usr/include/c++/4.8/bits/stl_vector.h:771
771 { return *(this->_M_impl._M_start + __n); }

// Running backtrace
(gdb) bt
#0 0x0000000000400f90 in std::vector<Node*, std::allocator<Node*> >::operator[] (this=0x0, __n=0)
at /usr/include/c++/4.8/bits/stl_vector.h:771
#1 0x0000000000400a87 in main () at minimumexample.cpp:28
----------------------------

而且我不确定如何解决这个问题。如果我使用数组而不是 vector ,则会产生类似的错误,所以我认为这不是 vector 类的问题?

With arrays instead of vectors
----------------------------
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400929 in main () at minimumexample.cpp:28
28 MyGrid[0].Triangles[0]->vertex[0]->x = 0;

// Running backtrace
(gdb) bt
#0 0x0000000000400929 in main () at minimumexample.cpp:28
----------------------------

下面是我正在尝试做的最简单的工作示例。我不确定为什么我会收到越界错误,因为我根本看不到 vector 中哪里越界了。

#include <iostream>
#include <vector>

using namespace std;

struct Triangle;

struct Node
{
double x;
double y;
vector<Triangle*> Triangles;
Node() : Triangles(6) {}
};

struct Triangle
{
vector<Node*> vertex;
Triangle() : vertex(3) {} // 3 vertices per triangle
};

int main()
{
int size = 10;
vector<Node> MyGrid(size);
double spacing = .25;

// The below code should create 3 vertices of the triangle with the
// three vertices of the triangle (x,y) defined as locations (0,0) for the
// first vertex, (1,0) for the second vertex, and (1,1) for the third.

MyGrid[0].Triangles[0]->vertex[0]->x = 0; // Line 28: Error here
MyGrid[0].Triangles[0]->vertex[0]->y = 0;
MyGrid[0].Triangles[0]->vertex[1]->x = 1;
MyGrid[0].Triangles[0]->vertex[1]->y = 0;
MyGrid[0].Triangles[0]->vertex[2]->x = 1;
MyGrid[0].Triangles[0]->vertex[2]->y = 1;

return 0;
}

对于遇到此问题的任何其他人,这是代码的工作版本:

#include <iostream>
#include <vector>

using namespace std;

struct Triangle;

struct Node
{
double x;
double y;
Triangle *Triangles;
};

struct Triangle
{
Node *vertex;
};

int main()
{
int size = 10;
vector<Node> MyGrid(size);
double spacing = .25;

// Allocate 6 Triangle objects into the variable Triangles
MyGrid[0].Triangles = new Triangle[6];
// Allocate 3 nodes for Triangles[0]'s vertex
MyGrid[0].Triangles[0].vertex = new Node[3];

MyGrid[0].Triangles[0].vertex[0].x = 0;
MyGrid[0].Triangles[0].vertex[0].y = 0;
MyGrid[0].Triangles[0].vertex[1].x = 1;
MyGrid[0].Triangles[0].vertex[1].y = 0;
MyGrid[0].Triangles[0].vertex[2].x = 1;
MyGrid[0].Triangles[0].vertex[2].y = 1;

return 0;
}

最佳答案

Node::Node ,

  vector<Triangle*> Triangles;  
Node() : Triangles(6) {}

你只是在初始化Triangles成为vector尺寸6 .这不会为您提供有效的内存位置 - Triangle*Triangles 中需要使用 new 进行分配.

通常,您不需要 vector<Triangle*> .只需使用 vector<Triangle>相反。

关于c++ - 访问存储在 vector 中的指针的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com