1

C++ でプログラミングを始めたばかりですが、定義した構造体から配列にアクセスする際に問題が発生しています。

OpenGL を使用して、テクスチャを使用してピクセル データの配列を画面に描画しています。ピクセル データの配列は、Image 構造体に格納されます。

struct Image {

GLubyte *pixels;
int width;
int height;
int bitrate;

Image(int w, int h, GLubyte* pixels, int bitrate){
    this->width = w;
    this->height = h;
    this->pixels = pixels;
    this->bitrate = bitrate;
}

};

イメージは次のように初期化されます。

GLubyte* pix = new GLubyte[WIDTH*HEIGHT*3];
Image image(WIDTH, HEIGHT, pix, 3);

Image インスタンスを使用して初期化される Screen と呼ばれる別の構造体があります。

    struct Screen{

    int width, height;
    Image* screen;

    void setScreen(Image* screen, const int width, const int height){
        this->screen = screen;
        this->width = width;
        this->height = height;
    }

};

画面は次のように初期化されます (Image 宣言の直後)。

displayData = new Screen();
displayData->setScreen(&image, WIDTH, HEIGHT);

Width または Height 変数にアクセスすると、正しい値が取得されます。次に、画面インスタンスをこのメソッドに渡します。

void renderScreen(Screen *screen){
std::cout << "Rendering Screen" << std::endl;
for(int x = 0; x < screen->width; x++){
    for(int y = 0; y < screen->height; y++){

        std::cout << "rendering " << x << " " << y << std::endl;

                    //Gets here and crashes on x - 0 and y - 0

        screen->write(0xFFFFFFFF, x, y);
    }
}
std::cout << "done rendering Screen" << std::endl;
}

これは次のように呼び出されます。

render(displayData); (displayData is a Screen pointer)

ポインターは私にとってまったく新しいものであり、構造体へのポインターの受け渡しに関する規則などは知りません。

4

1 に答える 1

3
displayData->setScreen(&image, WIDTH, HEIGHT);

Imageこれは、ローカル変数のアドレスを取得することにより、へのポインターを渡していることを示しているようです。

void method() {
  Image image;
  displayData->setScreen(&image, ..)
}

この状況でimageは、スタックに割り当てられ、そのローカル変数を宣言したスコープを終了すると、それへのポインターは無効になります。

代わりにヒープに割り当てる必要があります。

Image *image = new Image(..);
displayData->setScreen(image, ...);

このようにして、オブジェクトは で明示的に削除するまで存続しますdelete image

于 2013-08-27T20:50:24.573 に答える