2013-10-15 131 views
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; 
} 

當我打電話另一個模塊這一功能,使用這個C函數有什麼問題?

BAR_tppCarta *baralho = BAR_CriarBaralho(); 

窗戶停止工作,就像一個調試錯誤。 任何人都可以幫助我嗎?

非常感謝! Alessandro

+0

COPAS,ESPADAS,AS,KING和NUM_CARTAS是表中定義的常數.inc COPAS = 14; ESPADAS = 17; AS = 0; KING = 13; NUM_CARTAS = 52 –

+2

請在您的問題(或答案)中使用編輯功能添加附件? –

+0

我認爲AS必須是1.否則你的循環溢出,因爲(0..14)實際上是15次重複。 – user1952500

回答

7

BAR_tppCarta只是一個指針,所以你要返回的是一個未初始化的指針數組(你也在跺腳內存)。我懷疑這條線:

typedef struct Carta* BAR_tppCarta; 

也許應該是:

typedef struct Carta BAR_tppCarta; 

和這兩條線:

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

應該是:

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

或者你可以保持的BAR_tppCarta的原始定義爲

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++; 
     } 

,但我會反對這項建議在複雜的理由,除非你有一個很好這樣做的理由。

+1

好,保羅。 –

+0

實際上,這個想法是讓BAR_tppCarta成爲一個指針類型 –

+0

當然 - 你也可以這樣做,但是你需要爲每個實例分配內存。查看上面更新的答案。 –