4

だから私はプレイヤーの手札にカードを追加しようとしています...そして、カードの値は、一番上のカードと最後のカードにダブルポインターを使用する場合にのみメイン関数に戻されます。しかし、last->pt は temp に変換できません。これを修正するにはどうすればよいですか?

typedef struct card_s
{
char suit[9];
int value;
struct card_s *pt;
} card;

void deal_card(card **top, card **last, card dealt)
{
card *temp;

temp = (card*)malloc(sizeof(card));
strcpy(temp->suit, dealt.suit);
temp->value = dealt.value;

if(*top == NULL)
    *top = temp;
else
    *last->pt = temp; //FIX ME - something is going wrong at this point
*last = temp;
last->pt = NULL; //FIX ME - same problem as above
}
4

2 に答える 2

2

問題は演算子の優先順位にあると思われるため、括弧を使用すると解決するはずです。

(*last)->pt = temp;

最初に書かれた方法ではlast、(単一の) ポインターとして扱い、 member を逆参照しようとしていましたpt。代わりに、 を逆参照してから、結果のポインターのlastメンバーにアクセスします。pt

于 2013-12-08T00:34:36.180 に答える
2

構造体へのポインターは一般的であり、上記の例の括弧は厄介なので、構造体へのポインターで機能する別の構造体選択演算子があります。p が構造体へのポインターで、m がその構造体のメンバーである場合、

p->m

ポイントされた構造体のメンバーを選択します。したがって、式 p->m は次とまったく同じです。

(*p).m

一方、あいまいな組み合わせを使用しています。いずれかの形式を使用してください。たとえばlast->pt、または(*last).pt

また、これらの行には、そこに属さないアスタリスクが含まれていると思います:

if(*top == NULL)
    *top = temp;
else
    *last->pt = temp; //FIX ME - something is going wrong at this point
*last = temp;

一緒に、これはうまくいくはずです:

if(top == NULL)
    top = temp;
else
    last->pt = temp;
last = temp;

(ポインタが指しているアドレスを変更したいと仮定します。その前にアスタリスクを使用すると、ポインタが指している実際の値と比較/割り当てられます。

于 2013-12-08T00:36:30.327 に答える