Изменить значение в структуре в другой функции - PullRequest
2 голосов
/ 23 февраля 2012

Хорошо, я пытаюсь выучить некоторые базовые c, так как мне нужно это знать на моей обычной работе. Я привык к Java и имею некоторые проблемы с доступом и изменением значения члена структуры.

Программа, которую я пытаюсь собрать, представляет собой простой покерный клиент. У меня есть следующая структура:

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() берет массив карт и выбирает две случайные карты. То, что я пытаюсь сделать, это установить мой флаг "драже" в 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 остается неизменной. ура

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Следующее функционально эквивалентно коду, который вы разместили.Однако я внес ряд изменений, поэтому, пожалуйста, укажите на любые биты, которые требуют уточнения.

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 голосов
/ 23 февраля 2012

Вы проблема в том, что объекты в C не доступны по ссылке. Поэтому, когда вы делаете это:

kortHand[0] = kortArray[x];

вы создали копию базового объекта (например, clone в Java). Поэтому любые дальнейшие изменения в kortArray[x] не затронут sortHand[0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...