2016-11-06 9 views
-1

以下の関数は常にtrueを返します。私はポインターを比較していると思います。ポインタだけでなく値を比較するにはどうしたらいいですか?Cの2つのポインタの値を比較する方法

struct Card { 
    const char *suit; 
    const char *face; 
}; 

... 
struct Card hand[HAND_SIZE]; 
... 

//Determine whether the hand contains a pair. 
bool hasPair(struct Card wHand[]) { 
    bool result = false; 
    for (unsigned i = 0; i < HAND_SIZE; ++i) { 
     for (unsigned j = 0; j < HAND_SIZE; ++j) { 
      if(wHand[i].face == wHand[j].face && wHand[i].suit == wHand[j].suit) { 
       result = true; 
      } 
     } 
    } 
    return result; 
} 
+0

構造体で定数が宣言されているのはなぜですか? –

+4

それはあなた自身とカードを比較するからです。 – tkausl

+0

他の人が提起した問題との比較に加えて、ほとんどのカードゲームの**ペア**は同じ* face *値を持つ2枚のカードですが、必ずしも同じ* suit *である必要はありません。同じカードを比較しているように見えますが、おそらく面倒で比較する必要があるでしょう。 @selbie。 – selbie

答えて

2

このアルゴリズムの最大の問題は、あなたが自分自身でカードを比較しているということです:あなたはゼロでijの両方を起動するので、あなたは自分自身で各カードをペアリングするために偽陽性を取得します。

この簡単な修正は、ji+1に開始し、異なるカードのみを比較することです。 trueresultを設定すると、一方通行なので、あなたが一致するものを見つけるよう

、できるだけ早くtrueを返す考える:

for (unsigned i = 0; i < HAND_SIZE; ++i) { 
    for (unsigned j = i+1; j < HAND_SIZE; ++j) { 
     if(wHand[i].face == wHand[j].face && wHand[i].suit == wHand[j].suit) { 
      return true; 
     } 
    } 
} 
return false; 

注:これはfacesuitがで文字列定数に設定されていることを前提としてい複数のオブジェクトファイルをリンクすると壊れやすいかもしれない同じコードです。このためより安全オプションは、顔及びスーツ表現のためenumを使用して、各enum値の文字列表現のアレイを作ることになる。

enum Face { 
    Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace 
}; 
enum Suit { 
    Spades, Clubs, Diamonds, Hearts 
}; 
struct Card { 
    enum Face face; 
    enum Suit suit; 
}; 
+2

また動作することは確実ですか? 'strcmp'がここでもっと安全になるからです。 –

+0

@ Jean-FrançoisFabre私はCの文字列の代わりに 'enum'sを使うことを提案する以外は、その旨のメモを追加しようとしていました。ありがとうございました! – dasblinkenlight

+0

@dasbinkenlightありがとうございます。それでも、真の考えを返す – user2300867

1

resultは、それが起こるように、最初にtrueに設定する(されあなたのiループの反復では、各反復のある時点で、j==iと同じ配列要素をそれ自身と比較しています。 i!=jの場合にのみifステートメントを実行する必要があります。

しかし、元のポイントには、ポインタを比較していません - 実際の値を比較しています。配列[]角かっこは、ポインタの逆参照を行います。
wHand[i]は、*(wHand + i)と同じことを行います。

+0

。ありがとうございます。ちょうどCで始まり、まだポインタと混同します。 – user2300867

関連する問題