1

SDLを使用してRTSゲームに取り組んでいます。オブジェクトが近くの木から木材を収集するウッドヤード クラスがあります。このクラスでは、temp_trees というベクトルを作成し、コンストラクターの引数として、渡すツリー オブジェクトのベクトルを使用します。

ウッドヤード コンストラクター:

woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;
for(int i = 0; i < trees.size(); i++)
{
    if((trees[i].xPos - 100) / 50 >= x - 5 && (trees[i].xPos - 100) / 50 <= x + 4)
    {
        if((trees[i].yPos - 100) / 50 >= y - 5 && (trees[i].yPos - 100) / 50 <= y + 4)
        {
            temp_trees.push_back(trees[i]);
        }
    }
}

collect_control = 0;
no = 0;
}

collect_wood 関数:

void woodyard::collect_wood(){
if(no == 5)
{
 temp_trees[collect_control].drewno -= 1;
 if(temp_trees[collect_control].drewno <= 0){
 collect_control++;
 temp_trees.erase(temp_trees.begin());
}}


no++;
if(no >= 10){
  no = 0;
}}

起動直後にプログラムがクラッシュします。このコードにエラーが表示されることはありますか??

PS: コンストラクターで要素をあるベクターから別のベクターにコピーすると、何か問題が発生する可能性があると思います。

4

2 に答える 2

0

コンストラクターには不正な操作は含まれていません。

また、collect_wood() は、理解できませんが、クラッシュする明白な理由は含まれていません。

の値はどれcollect_controlですか? かどうかを確認します< temp_trees.size()か?temp_trees.size()要素を消去しているため、変化し続けることに注意してください。

おそらくcollect_control、消去後にインクリメントするべきではありません。すべての要素が元に戻り、消去後の collect_control はすでに次の要素を指しています。

注: これtemp_trees.erase(temp_trees.begin());は、ベクトルで実行できる最も非効率的なことの 1 つだと考えてください (最初の要素を削除する)。

于 2013-06-22T19:34:09.047 に答える
0

woodyard コンストラクターでは、一時的な関数スコープの変数 "temp_trees" を宣言しています。

woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;

temp_trees という名前のベクター メンバーがある場合、この宣言はそれを隠しています。したがって、メンバー関数は同じベクトルを認識していません。

void woodyard::collect_wood(){
if(no == 5)
{
 temp_trees[collect_control].drewno -= 1;

また、残りのコードを見ないと、ベクトルに少なくとも「collect_control」メンバーが存在することをどのように確認しているのかわかりません。

#include <assert.h>
...
assert(collect_control < temp_trees.size());

または、ビジュアルスタジオを使用している場合は、次のことができます

if(collect_control >= temp_trees.size())
    DebugBreak();

「size()」は 1 から始まる値ですが、配列インデックス演算子は 0 から始まります。つまり、ベクトルに 1 つのエントリがある場合、それは vector[0] になります。ベクトルが空の場合、vector[0] は無効です。存在しません。また、空であることは、サイズが 0 であることで示されます。サイズは、アクセスしようとしている要素のインデックスよりも常に大きくなければなりません。

于 2013-06-22T19:52:14.193 に答える