初始化在C结构

问题描述:

林有麻烦初始化结构(以及做的一切实际,但第一结构)。该结构首先在报头制备如下初始化在C结构

typedef enum cell 
{ 
    BLANK, RED, CYAN 
} Cell;  
#define NAMELEN 20 

typedef struct player 
{ 
    char name[NAMELEN + NULL_SPACE]; 
    Cell token; 
    unsigned score; 
} Player; 

void initFirstPlayer(Player * player); 
void initSecondPlayer(Player * player, Cell token); 

#endif 

================================= ======================================

,我试图在这里初始化它

void initFirstPlayer(Player * player) 
{ 
    int randNo = rand() % 2; 
    if (randNo == 0) { 
     token = RED; 
    } 
    else() { 
     token = CYAN; 
    } 


    player ; p1 = { 
    "placeholder", 
    token, 
    0, 

    } 
} 

void initSecondPlayer(Player * player, Cell token) 
{ } 

什么是初始化此播放器结构的正确方法?

+0

什么是玩家; p1 = {'?你用这个令牌序列说什么? – AnT

+0

'else(){' - >'else {','player; P1 = { “占位符”, 令牌, 0,}' - >'*玩家=(播放器){ “占位符”, 令牌, 0};'(也'细胞令牌;'需要) – BLUEPIXY

+0

玩家我认为是结构,而p1是一个实例(意思是玩家1) – Adam

我怀疑这应该为你工作。使用通用的initPlayer函数。用它为玩家分配内存并设置初始值。一定要包括一个freePlayer功能,你在玩家完成后free()

#include <stdlib.h> 
#include <string.h> 

Player* initPlayer() 
{ 
    Player* player = malloc(sizeof(Player)); 
    int randNo = rand() % 2; 
    if (randNo == 0) { 
     player->token = RED; 
    } 
    else { 
     player->token = CYAN; 
    } 

    const char* initName = "placeholder"; 
    strcpy(player->name, initName); 
    player->score = 0; 

    return player; 
} 
void freePlayer(Player* p) 
{ 
    free(p); 
} 

你会使用这将是像这样的方式:

int main() 
{ 
    Player* p1 = initPlayer(); 
    Player* p2 = initPlayer(); 

    play(p1, p2); 

    freePlayer(p1); 
    freePlayer(p2); 
} 
+0

或许,'p1'和'p2'的'token'需要互不相同。 – BLUEPIXY

+0

是的,他们应该更清楚。 – Adam

+0

然后只需将一些条件作为参数传递给'initPlayer()' – Stewart

假设你有至少C99的支持,从而使复合文字和指定的初始提供给你,那么你可以使用:

void initFirstPlayer(Player *player) 
{ 
    *player = (Player){ .token = rand() % 2 ? CYAN : RED, 
         .score = 0, 
         .name = "placeholder" 
         }; 
} 

这对结构赋值地址被传递给函数的变量。它将它压缩成一个声明;如果你愿意,你可以把它分成几个。这是三元运算符? :有用的场合。您可能更喜欢(rand() % 2)以及额外的括号;我可能会添加它们,因为我会忽略它们。

字面化合物来自(typename){ ...initializer for typename... }

指定的初始化是.member = value符号。

如果你坚持C90支持,你必须更加努力地工作,也许创建用正确的信息一个局部变量,然后做结构分配。

void initFirstPlayer(Player *player) 
{ 
    Player p1 = { "placeholder", rand() % 2 ? CYAN : RED, 0 }; 
    *player = p1; 
} 

现在的责任是你列出初始化以正确的顺序。

另一种方法是接受要inicialize作为参数的球员:

void initPlayer(Player* player) 
{ 
    int randNo = rand() % 2; 
    if (randNo == 0) { 
     player->token = RED; 
    } 
    else { 
     player->token = CYAN; 
    } 
    const char* initName = "placeholder"; 
    strcpy(player->name, initName); 
    player->score = 0; 
} 

int main() { 
     Player p1; 

     initPlayer(&p1); 
} 

你可以拥有的球员数组或由malloc分配dinamically。