0
typedef struct Carta* BAR_tppCarta
BAR_tppCarta * BAR_CriarBaralho () 
{
    int i;
    int j;
    int k=0;
    BAR_tppCarta *baralho;
    baralho = (BAR_tppCarta *) malloc(NUM_CARTAS*sizeof(BAR_tppCarta));
    if(!baralho)
        return NULL;
    for(i=COPAS;i<=ESPADA;i++)
        for(j=AS;j<=KING;j++)
            {
                baralho[k]->naipe = i;
                baralho[k]->valor = j;
                k++;
            }
    return baralho;
}

を使用して、別のモジュールでこの関数を呼び出すと、

 BAR_tppCarta *baralho = BAR_CriarBaralho();

デバッグ エラーのように、ウィンドウが機能しなくなります。誰でも私を助けてもらえますか?

どうもありがとう!アレッサンドロ

4

1 に答える 1

7

BAR_tppCartaは単なるポインターであるため、返されるのは初期化されていないポインターの配列だけです (また、メモリを踏みにじっています)。私はこの行を疑う:

typedef struct Carta* BAR_tppCarta;

おそらく次のようになります。

typedef struct Carta BAR_tppCarta;

そして、これらの2行:

            baralho[k]->naipe = i;
            baralho[k]->valor = j;

次のようにする必要があります。

            baralho[k].naipe = i;
            baralho[k].valor = j;

BAR_tppCartaまたは、 asの元の定義を保持することもできます

typedef struct Carta* BAR_tppCarta;

次に、各インスタンスにメモリを割り当てます。

for(i=COPAS;i<=ESPADA;i++)
    for(j=AS;j<=KING;j++)
        {
            baralho[k] = malloc(sizeof(struct Carta));
            baralho[k]->naipe = i;
            baralho[k]->valor = j;
            k++;
        }

ただし、このようにする正当な理由がない限り、複雑さを理由にこれに反対することをお勧めします。

于 2013-10-15T20:16:46.570 に答える