Почему мой файл main.c не получает обновленные значения этой глобальной статической переменной? - PullRequest
0 голосов
/ 01 мая 2018

Я строю основную карточную игру, и для этого я должен создать колоду карт (хотя не обычную колоду карт) и перемешать ее. Это работало довольно хорошо на Visual Studio (Windows 10), но как только я переключился на Xcode (Mac OS X 10.11.16), я не могу получить те же результаты.

Вот мой main.c, ссылающийся на мой .h файл:

#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(void){

    Card* lst = NULL;

    if(CRD_createDeck(lst) != CRD_retCondOK)
        printf("Something is wrong\n");
    CRD_showDeck(b);

    if(b == NULL)
        printf("Empty\n");

    return 0;
}

Файл My Card.h определяет карту * b:

static Card* b;

И мой файл Card.c:

#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

CRD_tpRetCond CRD_createDeck(Card* lst){

    int numCards, numSuits, CardEnum = 1;
    char vetCardName[10] = {'4', '5', '6', '7', 'Q', 'J', 'K', 'A', '2', '3'};
    char vetCardSuit[4][8] = {"Ouros", "Espadas", "Copas", "Paus"};

    /*
     lst = CRD_createList();
     if(lst != NULL)
     return CRD_retCondCreateError;*/

    CardInfo* generico;
    for(numSuits = 4; numSuits >= 1; numSuits--){
        for(numCards=10;numCards >= 1; numCards--) {
            generico = CRD_createCard(vetCardName[numCards-1],numCards,vetCardSuit[numNaipes-1],numSuits);
            lst = CRD_insertCard(lst,generico,CardEnum);
            CardEnum++;
        }
    }
    b = lst;
    CRD_showDeck(b);
    return BAR_CondRetOK;
}

Я прошу прощения, если есть какие-либо несоответствия с именами переменных, я быстро перевел с португальского на английский, чтобы дать вам лучшую идею. Когда я вызываю функцию CRD_showDeck (b), она правильно показывает все карты в колоде. Тем не менее, моя основная функция считает b пустым. Почему это происходит?

1 Ответ

0 голосов
/ 01 мая 2018

A static переменная ограничивает область действия переменной файлом. Таким образом, объявление переменной static в заголовочном файле приводит к созданию отдельных переменных в каждом исходном файле, который содержит заголовок. Каждый с областью, ограниченной этим исходным файлом. Таким образом, изменение значения переменной в одной единице перевода не влияет на копию, созданную в каждой из других единиц перевода.

По-настоящему глобальная переменная (видимая каждой единицей перевода) должна быть объявлена ​​extern в заголовочном файле и определена точно в одном из исходных файлов. Учитывая имя ваших исходных файлов, я бы предпочел добавить строку:

Card* b;

В Card.c и измените static на extern в заголовочном файле.

...