0

.cppファイルの15行目にセグメンテーション違反が発生しています。理由はわかりません。さまざまなコードスニペット:explosionhandler.h:

    class explosionhandler {
        public:
    struct explosion {
    ...
    };
    vector<struct explosion> explosions;
    struct explosion_type {
    ...
    };
    vector<struct explosion_type> type;
    int num_types;

    explosionhandler();
    ~explosionhandler();
    void registerexplosion(int& ttype,ALLEGRO_BITMAP*& b,int seq, float a, float m,float e);

    void createexplosion(int ttype,float x,float y);
    void drawexplosions(ALLEGRO_BITMAP* screen);

    void gettype(explosion_type& a,ALLEGRO_BITMAP*& b,int& nseq, float& aa, float& ee, float& mm);


        };#endif 

explorehandler.cpp:

    explosionhandler::explosionhandler()
    {
        num_types=0;
    }
    void explosionhandler::registerexplosion(int& ttype,ALLEGRO_BITMAP*& b,int seq, float a, float m,float e)
    {
        explosion_type n;
        ....
        ttype = num_types;     /*********** right here *******************/
        num_types++;
        type.push_back(n);
    }

オブジェクトロケットへのポインタとして渡されたexplosionhandler:

rocket.h:

...
class explosionhandler;
class rocket {
public:
        ...
        void setrocket(ALLEGRO_BITMAP*& a,ALLEGRO_BITMAP*& b, explosionhandler*& h);
        ...
        int exptype;
        ...
}; #endif

rocket.cpp:

rocket::rocket()
{
        ...
        exptype=-1;
}
void rocket::setrocket(ALLEGRO_BITMAP*& a,ALLEGRO_BITMAP*& b, explosionhandler*& h)
{
    handler = h;
    area.sethitboundaries(a);
    fprintf(stdout,"setrocket, # of rockets in vector: %i\n",(int)rockets.size());
h->registerexplosion(exptype,b,3,(float)al_get_bitmap_width(b),(float)0,(float)-18); //called function
}

そして最後にmain.cpp(省略形):

#include "rocket.h"
#include "explosionhandler.h"
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <stdio.h>
#include <cstdlib>
#define PI 3.14159265
...
rocket rock(bullet_speed+2,width,height);
explosionhandler *handler;
...
int setup()
{
        ...
        rock.setrocket(rk,exp,handler);
        rock.setlimit(5);
        al_set_target_bitmap(al_get_backbuffer(display));
        ...
}
...

わかりました。問題はハンドラーが初期化されていなかったことです。おっと。

そしてもちろん、explosionhandlerはmain.cppのポインターであり、rocketはmain.cppで宣言されたオブジェクトであり、どちらもグローバルです。

私の小さな初心者の心を祝福してください。私は自分が何をしているのかわかりません。

4

1 に答える 1

3

rocket::setrocket私の精神的な感覚は、あなたがパラメータとしてNULLポインタ(またはより具体的には、NULLポインタへの参照)を使用して呼び出していることを教えてくれます。hそして、あなたはh->registerexplosion()NULLポインタを呼び出しています。

そうしないでください。代わりに有効なポインタを渡すか、新しいオブジェクトを割り当ててください(後で正しく削除するようにしてください)。

于 2012-07-22T00:55:01.833 に答える