2011-09-15 5 views
0

私のアプリケーションは何らかの理由でクラッシュし続けます。私はベクタにとって新しいので、私のところには何か愚かなものがあります。C++のベクタの問題

#include <iostream> 
#include <vector>  

using namespace std; 

class Projectile 
{ 
private: 
    SDL_Surface *projectile; 
    void load(); 

public: 
    int count; 

    vector<int> c; 
    vector< vector<int> > p; 

    int positionX; 
    int positionY; 

    Projectile(); 
    void newProjectile(int, int); 
    void drawCurrentState(SDL_Surface*); 
}; 

... 
... 

void Projectile::newProjectile(int x, int y) 
{ 
    positionX = x; 
    positionY = y; 

    c.push_back(10); 
    c.push_back(10); 

    //p.push_back(c); //trying to start off simple before i do multidimensional. 
} 

void Projectile::drawCurrentState(SDL_Surface* destination) 
{ 
    SDL_Rect offset; 
    offset.x = c[0]; //will eventually me the multidimensional p vector 
    offset.y = c[1]; // 

    SDL_BlitSurface(projectile, NULL, destination, &offset); 
} 

私はここで間違っていますか?私は2つの値を戻しますが(テストを終えた後xとyのintになります)、スクリプトのoffset.x = c[0];部分に到達するとクラッシュするようです。

確かに、c [0]とc [1]の両方が10になるはずです。

+1

「newProjectile」の前に 'drawCurrentState'を呼び出しましたか? 'offset.x'への代入の前に' std :: cout << c.size()<< std :: endl;を挿入してください。 –

+0

このコードからはわかりません。私の推測では 'Projectile'の別のインスタンスで作業しています(コピーコンストラクタが表示されていない場合は不完全です)。コピー後に空の' c'ベクターになります...ロングショット – sehe

+0

おそらく 'vector :: at '' vector :: operator [] 'の代わりにヒントを与えます。サブスクリプトが有効でない場合、out_of_range例外がスローされます –

答えて

3

そうだね、両方とも[0]と[1]最初に)ちょうどあなたが本当にnewProjectileを(呼び出して確認してください10.

こと、および無効な宛先ポインタなど他の問題がないことを確認しなければならないとそうです。

+0

ああ、はい、メインループにあらかじめ起動させる条件があるようです。ありがとう! – grep

+0

@Headspin:これはあなたのデザインが堅牢でないことを示していることに注意してください。それは非常に簡単にそれを破るようにあなたが_undefined behaviour_を引き起こした、あなたは**あなたがコードが生産に入る前にクラッシュを与えた**幸運**だった。代わりに、境界チェックを実装して、この種のものを捕まえるか、関数の周りをシャッフルして、あらかじめ呼び出されているものに依存しないようにしてください。 –

+0

正直言って、削除するのを忘れたのはちょうど古いコードでした。しかし、アドバイスをありがとう。 – grep

1

多分、ベクトルcは、c [0]が読み取られる行で空です。 c.size()の結果を確認してください。

2

コードは大丈夫ですが、呼び出しの順序は重要です。 drawCurrentState()を呼び出す前にnewProjectile()を呼び出すようにしてください。たとえば、次のようになります。

Projectile * projectile = new Projectile(); 
projectile->newProjectile(1,1); 
projectile->drawCurrentState(...);