我有这个结构:
typedef struct {
QPolygon polygon;
QRect position;
} form;
我尝试初始化forms
,如下所示,但我得到了分段错误错误:
int n = 10
forms = (form*) malloc(sizeof(form) * n);
while (n>0) {
forms[n].position.setRect(0,0,0,0);
forms[n].polygon=QPolygon(0); //error - segmentation fault
forms[n].polygon = QPolygon(QRect(x, y, w, h)); //error - segmentation fault
}
我也是这样尝试的:
QPolygon v;
v = QPolygon(QRect(x, y, w, h)); //ok
v = QPolygon(QRect(x, y, w, h)); //ok
sprites[n].polygon = QPolygon(QRect(x, y, w, h)); //error - segmentation fault
如何将多边形添加到结构中?
答案 0 :(得分:1)
首先,在C ++中定义你的结构:
struct form { // note: Qt naming convention would use upper case first letter
QPolygon polygon;
QRect position;
};
在这个答案的最后有一个更现代的选择,但首先,要直接修复你20岁的C ++样式,写这样的代码(你不应该这样,但只是你知道怎么做它):
为此,我们假设你有
form *forms;
然后你可以让你的代码不会崩溃,如果你这样写的话:
int n = 10
forms = new form[n]; // bad style in modern C++, use std::vector instead
while (n > 0) {
--n; // indexes go 9..0
//forms[n].position.setRect(0,0,0,0); // constructor did this
//forms[n].polygon=QPolygon(0); // constructor did this
forms[n].polygon = QPolygon(QRect(x, y, w, h));
}
您的错误可能,因为QPolygon
结构中的QRect
和form
个实例未正确构建。很难说,你所做的是未定义的行为,访问未初始化的内存。此外,您在循环的第一次迭代中有n==10
,它在有效索引范围0..9之外,可能已经崩溃。
此外,当您使用new
分配数组时,必须也将其作为数组删除,以便数组元素被正确销毁:
delete[] forms;
使用现代C ++,您不需要这样做,您可以使用值类型或智能指针。
最后,一个更现代的版本,只是更容易和更安全,你不必担心释放内存等:
std::vector<form> forms;
int n = 10
forms = std::vector<form>(n); // assign a vector of length n to forms
while (n > 0) {
... contents of the loop are same as above ...
}
答案 1 :(得分:1)
由于您正在编写C ++ 11而不是C,因此您的代码应该更简单。利用您正在使用的语言。
emplace_back
在向量中构建Form
实例:它是最快的方法。你也可以使用push_back
,但这构成了一个不便于移动的临时性。
struct Form {
QPolygon polygon;
QPoint position; // maybe you meant QRect boundingRect?
Form(const QPolygon & polygon, const QPoint & position) :
polygon{polygon}, position{position} {}
Form() = default;
};
class Class {
std::vector<Form> forms;
public:
Class() {
int x = 0;
int y = 0;
int w = 100;
int h = 100;
forms.reserve(20); // avoids copies as the vector grows
for (int i = 0; i < 10; ++i)
forms.emplace_back(QRect{x,y,w,h}, QPoint{x,y});
for (int i = 0; i < 10; ++i)
forms.push_back({QRect{x,y,w,h}, {x,y}}); // uniform initialization
}
};