2

C++ を使用して 2 人のプレイヤー間の従来のカード ゲームをシミュレートしています。「カード」構造を定義して、

card sample;
cout << sample.numb << " of " << sample.suit << " ownded by player " << sample.own

たとえば、「スペードの 10 はプレイヤー 2 が所有しています」と表示されます。

すべてのカードを追跡するベクトル「デッキ」(サイズ 40) を設定し、プレーヤー 1 の手札を処理するために、ゲームのすべてのステップでベクトル「g1」、「g2」、および「タブ」を動的に割り当てています。 、プレイヤー 2 の手札と、3 つのオブジェクトが分離されたテーブル上のカード (これは、ゲーム自体に必要なものです)。

プレイヤーはテーブルにカードを置き続け、新しいカードを獲得/喪失し続けるため、サイズが変化し続けるので、毎回次のようなことを行います:

delete g1;
delete g2;
delete tab;
n1=count (1,deck);  // this counts how many cards in "deck" have .own field==1
n2=count (2,deck);  // this counts how many cards in "deck" have .own field==2
nt=count (0,deck);  // cards having .own field == 0 are on the table
g1 = new card [n1];
g2 = new card [n2];
tab = new card [nt];
k=0;               // using this to move through the vectors I just re-allocated
for (i=0;i<40;i++) {
  if(deck[i].own==1) {
     g1[k]=deck[i];
     k++;
  }
}
// then I fill "g2" and "tab" pretty much in the same way

スクリプトはコンパイルおよび実行されますが、(正しく実行された) 数回のラウンドの後、「無効な次のサイズ (高速)」と segfault が発生します。周りを読んで、これは通常、何かを2回削除しようとしたときに発生することがわかりました。私のスクリプトは何も 2 回削除しませんが、このような new-delete-new の頻繁な使用は推奨されておらず、問題の原因である可能性があると思います。

考え?

編集 std::vector を使用して問題を解決しました。同じ問題を抱えている人には同じことをお勧めします。答えてくれたみんなに感謝します。

平和、

トム

4

2 に答える 2