我正在构建一个基本的纸牌游戏,为此我必须创建一副纸牌(虽然不是一副普通的纸牌)并洗牌。它在 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;
}
我的 Card.h 文件定义了 Card* 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 是空的。为什么会这样?
最佳答案
static
变量将变量的范围限制在文件中。因此,在头文件中将变量声明为 static
最终会在包含头文件的每个源文件中创建不同的变量。每一个的范围都限于该源文件。因此,更改一个翻译单元中的变量值不会影响在每个其他翻译单元中创建的副本。
一个真正的全局变量(每个翻译单元都能看到)应该在头文件中声明为extern
,并且应该在一个源文件中定义。鉴于您的源文件的名称,我可能会选择添加行:
Card* b;
在Card.c
中,将头文件中的static
改为extern
。
关于c - 为什么我的 main.c 文件没有得到这个全局静态变量的更新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50108395/