2013-10-15 103 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

当然 - 你也可以这样做,但是你需要为每个实例分配内存。查看上面更新的答案。 –