-1

私はこの構造を持っています:

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

多角形を構造体に入れるにはどうすればよいですか?

4

2 に答える 2

1

C ではなく C++11 を作成しているため、コードははるかに単純になるはずです。使用している言語を活用します。

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
    }
};
于 2016-08-30T14:48:01.593 に答える
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));
}

構造体内のandインスタンスが適切に構築されていなかったため、エラーが発生した可能性があります。言うのは難しいですが、あなたがしたことは未定義の動作であり、そのような初期化されていないメモリにアクセスしていました。さらに、有効なインデックス範囲 0..9 の外にあるループの最初の繰り返しで、クラッシュした可能性があります。QPolygonQRectformn==10


さらに、 で配列を割り当てるときは、配列要素が適切に破棄されるように、配列としても削除する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 ...
}
于 2016-08-30T14:19:53.870 に答える