2012-02-23 84 views
2

好的,所以我试图学习一些基本的c,因为我需要知道在我的工作。我习惯了Java,并且在访问和改变一个struct成员的值时遇到了一些麻烦。在不同的函数中改变一个结构体的值

我试图建立的程序是一个简单的扑克客户端。 我有以下结构:

typedef struct kort{ 
     int draget; 
     char farg; 
     int nummer; 
     struct kort *next; 
    }kort; ` 

我也有一个名为“blandaKort()”,其产生该结构的52名成员,并把它们添加到一个阵列中,分配服和号码功能。代码如下:

void blandaKort(){ 

    char farg[4]={'S','K','R','J'}; 
    int nummer[14]={0,2,3,4,5,6,7,8,9,10,11,12,13,14}; 
    kort kortArray[52]; 
    int tempRaknare=0; 
    int i; 
    int j; 
    kort *huvud=NULL; 

    for(i=0; i<=3; i++){ 
      for(j=1; j<=13; j++){ 
      kort *huvud=NULL; 
      // kort k; 

       kort *k; 
       k=(kort*)malloc(sizeof(kort)); 

       k->farg=farg[i]; 
       k->nummer=nummer[j]; 
       k->draget=0; 
       huvud=k; 

      // k.farg=farg[i]; 
      // k.nummer=nummer[j]; 
       kortArray[tempRaknare]=*k; 
       tempRaknare++; 
     } 
} 
tempRaknare, i, j =0; 

delaHand(kortArray); 

}

功能delaHand()取卡的阵列,并选择两个随机卡。我试图完成的是将我的标志“draget”设置为1,它告诉我哪些卡被绘制。代码如下:

void delaHand(kort kortArray[]){ 

srand(time(NULL)); 
int x = rand() % 52 + 1; 
int y = rand() %52+1; 

kort *k; 
k=(kort*)malloc(sizeof(kort)); 

kort kortHand[2]; 
//if(kortArray[x].draget!=1){ 
    kortHand[0]=kortArray[x]; 
    *k=kortArray[x]; 
    k->draget=1; 
    kortArray[x]=*k; 

    // } 
//if(kortArray[y].draget!=1){ 
    kortHand[1]=kortArray[y]; 
    kortArray[y].draget=1; 

.....

时,即时通讯打印的kortHand[]成员它显示了正确的西装和数量,但是变量draget保持不变。 欢呼声

回答

3

以下功能等同于您发布的代码。不过,我已经做了一些修改,所以请指出一些需要澄清的部分。

typedef struct _kort { 
    int draget; 
    char farg; 
    int nummer; 
    struct _kort *next; 
} kort; 

void blandaKort(void){ 

    char farg[4] = { 'S', 'K', 'R', 'J' }; 
    kort kortArray[52]; 
    int i; 

    for(i = 0; i < 52; i++){ 
     kortArray[i].farg = farg[i/13]; 
     kortArray[i].nummer = i % 13 + 2; 
     kortArray[i].draget = 0; 
    } 

    delaHand(kortArray); 
} 

void delaHand(kort kortArray[]){ 

    srand(time(NULL)); 
    int x = rand() % 52 + 1; 
    int y = rand() % 52 + 1; 

    // Note: the valid indexes of kortArray are 0 - 51. 
    // x and y will have values that range from 1 - 52. 
    // This is probably not what you want. 

    kortArray[x].draget = 1; 
    kortArray[y].draget = 1; 

    // ... 
} 

你的基本问题是在复制一个结构,当你只想复制指针。例如。 *k = kortArray[x];复制结构体的值,以便您现在具有指向两个碰巧具有相同值的结构体的指针。相反,k = &(kortArray[x]);会产生两个指向内存中相同结构的指针。上面的代码通过直接引用数组来避免这个问题。

2

问题是C中的对象不能被引用访问。所以,当你这样做:

kortHand[0] = kortArray[x]; 

你所创建的基础对象的副本(如clone在Java中)。因此,对kortArray[x]的任何进一步更改都不会影响sortHand[0]

+0

有人建议我删除delaHand()中的k变量,所以我将代码更改为:kortArray [x] .draget = 1; kortHand [0] = kortArray [x];并知道它工作正常。我必须承认我有一些问题,理解c中的整个引用处理(每当使用指针时,*或&:) :) – 2012-02-23 08:40:23

相关问题