2012-02-23 8 views
2

私は自分の勤務先の仕事でそれを知る必要があるので、基本的なCを学びたいと思っています。私はJavaを使用していましたが、構造体メンバの値にアクセスしたり変更したりするのに少し問題がありました。別の関数の構造体の値を変更する

ビルドしようとしているプログラムは単純なポーカークライアントです。 は、私は、次の構造体を持っている:

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

私も構造体の52人のメンバーを作成し、スーツや番号を割り当て、配列に追加「blandaKort()」という名前の関数を持っています。コードは次のとおりです。

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()は、カードの配列を受け取り、そして2枚のランダムなカードを選択します。私が達成しようとしているのは、私の旗 "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];は構造体の値をコピーするので、同じ値を持つ2つの構造体へのポインタがあります。対照的に、k = &(kortArray[x]);は、メモリ内の同じ構造体を指す2つのポインタをもたらす。上記のコードは、配列を直接参照するだけで問題を回避します。

2

Cのオブジェクトは参照によってアクセスされません。だから、あなたがこれを行うとき:

kortHand[0] = kortArray[x]; 

あなたは(Javaでのようなclone)基礎となるオブジェクトのコピーを作成しました。したがって、kortArray[x]の変更はsortHand[0]には影響しません。

+0

誰かがdelaHand()でk変数を削除することを提案したので、コードをkortArray [x] .draget = 1;に変更しました。 kortHand [0] = kortArray [x];それがうまく動作することを知っている。私は、(ポインタ、*または&)を使用するときはいつも、cでの参照処理全体を理解する上で問題があることを認めなければなりません:) –

関連する問題