2012-02-23 57 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

相關問題