2017-08-25 174 views
-3

林有麻煩初始化結構(以及做的一切實際,但第一結構)。該結構首先在報頭製備如下初始化在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

回答

1

我懷疑這應該爲你工作。使用通用的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

0

假設你有至少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; 
} 

現在的責任是你列出初始化以正確的順序。

0

另一種方法是接受要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。