1

これまでのコードは、カードのデッキ、9 - ACE各スイートの値を作成し、5 枚のカードを 4 人のプレイヤーに配ることを目的としています。カードが配られ3-2-3-22-3-2-3各プレイヤーは合計 5 枚のカードを持ちます。後で、カードをシャッフルし、ユーカー ゲームでそれらを比較するコードを記述しますが、今のところ、カードを配りたいだけです。とにかく、それは正確には機能しません。私は提案を受け付けています。私が得るエラーは「セグメンテーション違反:11」です

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>

using namespace std;

int cards[24]; //array filled with card values
char DECK[24][25] = 
{ //array filled with card names. Used for dealing //24elements long //25 characters in    each element
"Ace of Spades", "Nine of Spades", "Ten of Spades", "Jack of Spades", "Queen of Spades", "King of Spades",

"Ace of Hearts", "Nine of Hearts", "Ten of Hearts", "Jack of Hearts", "Queen of Hearts", "King of Hearts",

"Ace of Clubs", "Nine of Clubs", "Ten of Clubs", "Jack of Clubs", "Queen of Clubs", "King of Clubs",

"Ace of Diamonds", "Nine of Diamonds", "Ten of Diamonds", "Jack of Diamonds", "Queen of Diamonds", "King of Diamonds" 
};

int main (void)
{
char P1[5][25];
char P2[5][25];
char P3[5][25];
char P4[5][25];

for( int i = 0 ; i < 24 ; ++i) // for the total amount of cards
{
  for(int j = 0; j < 25; j++)
  {
      //1st deal 3-2-3-2
      if(i < 3) // 0 - 2 // 3 cards
      {
        P1[i][j] = DECK[i][j];
      }
  if((i > 2) && (i < 5))// 3 - 4 // 2 cards
  {
    P2[i][j] = DECK[i][j];
  }
  if((i > 4) && (i < 8)) // 5 - 7 // 3 cards
  {
    P3[i][j] = DECK[i][j];
  }
  if((i > 7) && (i < 10))// 8 - 9 // 2 cards
  {
    P4[i][j] = DECK[i][j];
  }
  //2nd deal 2-3-2-3
  if((i > 9) && (i < 12)) // 10 - 11 // 2 cards
  {
    P1[i][j] = DECK[i][j];
  }
  if((i > 11) && (i < 15))// 12 - 14 // 3 cards
  {
    P2[i][j] = DECK[i][j];
  }
  if((i > 14) && (i < 17)) // 15 - 16 // 2 cards
  {
    P3[i][j] = DECK[i][j];
  }
  if((i > 16) && (i < 20))// 17 - 19 // 3 cards
  {
    P4[i][j] = DECK[i][j];
  }
  }
}

for(int q = 0; q < 5; ++q)
{
  cout << "P1 has the card " << P1[q]<< endl;
}
for(int q = 0; q < 5; ++q)
{
  cout << "P2 has the card " << P2[q]<< endl;
}
//for(int q = 0; q < 5; ++q)
{
  //cout << "P3 has the card " << P3[q]<< endl;
}
//for(int q = 0; q < 5; ++q)
{
 //cout << "P4 has the card " << P4[q]<< endl;
}

return 0;
}
4

4 に答える 4

9

「あなたに釣りを教えてあげましょう」:

デバッガーは、障害がどこにあるかを正確に教えてくれます。IDE (Xcode、Eclipse、VS) を使用している場合は、適切なインターフェイスがあり、それを使用する必要があります。そうでない場合:

$ gdb my_executable
...
> run
...
Segmentation fault
> where

これにより、正確な場所 (どの行番号で機能するか) が得られます。

于 2013-10-12T19:50:15.043 に答える
1

このような配列があります

char P1[5][25];

それでも、コードでは、iインデックスが 5 より大きい要素に値を割り当てています。有効で範囲内の要素に割り当てるインデックスを制限する必要があります。0 から 4 の間および 0 から 24 の間のP1[i][j]値に割り当てることのみが有効です。これから逸脱すると、配列の境界外にあるメモリ位置に割り当ててはならないため、セグメンテーション違反のリスクが発生します。ij

于 2013-10-12T19:50:23.343 に答える
1
 if((i > 4) && (i < 8)) // 5 - 7 // 3 cards
  {
    P3[i][j] = DECK[i][j];

P3[5]... P3[6]... P3[7]...に割り当てていますが、存在しません。後で、さらに大きなインデックスで同じことをしています。i=[0,4] j=[0,24] を使用する必要があります

于 2013-10-12T19:55:08.117 に答える