-1

ヘッダーにこれがあります:

    struct Surface {
        char *objectName;
        int xPos;
        int yPos;
        SDL_Surface *surface;
    };

    struct WorldSurface {
        Surface *surface = new Surface[MAX_SURFACES];
        int counter = 0;
        int current = 0;
    };

    WorldSurface *worldSurface;

次に、.cpp で worldSurface を初期化します。

    WorldSurface *worldSurface = new WorldSurface[MAX_LEVELS];

そして、この関数は、何があっても機能しません.= NULL、ポインター、.の代わりに->をいじってみました...(私はポインターサブジェクトにあまり精通していないことに注意してください)

    void drawClass::addSurface(char* objectName, char* surfaceFile, int xPos, int yPos, int drawLevel) {
        int cnt = worldSurface[drawLevel].counter;
        worldSurface[drawLevel].surface[cnt].objectName = objectName;
        worldSurface[drawLevel].surface[cnt].surface = load_image(surfaceFile);
        worldSurface[drawLevel].surface[cnt].xPos = xPos;
        worldSurface[drawLevel].surface[cnt].yPos = yPos;
        worldSurface[drawLevel].counter++;
    }

これは 10 個の worldSurfaces で、それぞれに 50 個のサーフェス構造体が含まれています。worldSurface[drawLevel] 内にある構造体にアクセスしたいのですが、アクセスしたいサーフェス構造体は、worldSurface の .counter 変数で認識されています。しかし、基礎となるサーフェス構造体へのアクセスはすべてセグメンテーション違反で失敗し、その理由がわかりません...

助けてくれてありがとう!

4

1 に答える 1

1

あなたWorldSurfaceは正しく定義も初期化もされていません:

struct WorldSurface {
    Surface *surface = new Surface[MAX_SURFACES];
    int counter = 0;
    int current = 0;
};

クラスの宣言とともにデータを所定の位置に初期化することはできません。これはコンストラクターで行う必要があります。例:

struct WorldSurface {
    Surface *surface;
    int counter;
    int current;
};
...
WorldSurface::WorldSurface():
    counter(0),current(0),surface(new Surface[MAX_SURFACES]){}
于 2012-12-12T06:20:23.253 に答える