2017-08-25 13 views
-3

Ich habe Probleme, die Strukturen zu initialisieren (gut alles tatsächlich zu tun, aber Strukturen zuerst). Die Struktur wird zunächst in einem Header gemacht wieInitialisierung einer Struktur in C

folgt
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 

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

und ich habe versucht, es hier zu initialisieren

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) 
{ } 

Was ist die richtige Methode, um diese Player-Struktur zu initialisieren?

+0

Was ist 'player; p1 = {'? Was wolltest du mit dieser Folge von Tokens sagen? – AnT

+0

'else() {' -> 'else {', 'player; p1 = { "Platzhalter", Token, 0} '->' * player = (Player) { "Platzhalter", Token, 0}; '(auch' Handy-Token; 'Notwendigkeit) – BLUEPIXY

+0

Spieler, den ich dachte, ist die Struktur, und p1 ist eine Instanz davon (dh Spieler 1) – Adam

Antwort

1

Ich vermute, das sollte für Sie arbeiten. Verwenden Sie eine generische initPlayer Funktion. Verwenden Sie das, um Speicher für den Player zuzuweisen und die Anfangswerte festzulegen. Achten Sie darauf, auch eine freePlayer Funktion, wo Sie free() den Player, wenn Sie fertig sind.

#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); 
} 

Die Art und Weise Sie dies wie so wäre verwenden würde:

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

    play(p1, p2); 

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

Vielleicht müssen die 'Token' von' p1' und 'p2' voneinander verschieden sein. – BLUEPIXY

+0

Ja, sollten sie klarer sein. – Adam

+0

Dann übergeben Sie einfach eine Bedingung als Argument an 'initPlayer()' – Stewart

0

Vorausgesetzt, dass Sie mindestens C99 Unterstützung haben, so dass die Verbindung Literale und bezeichnet initializers Ihnen zur Verfügung stehen, dann können Sie verwenden :

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

Dies führt eine Strukturzuordnung zu der Variablen durch, deren Adresse an die Funktion übergeben wird. Es komprimiert alles zu einer Aussage; Sie können es in mehrere teilen, wenn Sie möchten. Dies ist eine Gelegenheit, bei der der ternäre Operator ? : nützlich ist. Vielleicht bevorzugen Sie (rand() % 2) mit den zusätzlichen Klammern; Ich würde sie wahrscheinlich so oft hinzufügen, wie ich sie weggelassen habe.

Das zusammengesetzte Literal kommt von (typename){ ...initializer for typename... }.

Die angegebenen Initialisierer sind die .member = value Schreibweisen.

Wenn Sie mit der C90-Unterstützung festgefahren sind, müssen Sie härter arbeiten und vielleicht eine lokale Variable mit den korrekten Informationen erstellen und dann die Strukturzuweisung vornehmen.

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

Jetzt ist es an Ihnen, die Initialisierer in der richtigen Reihenfolge aufzulisten.

0

Eine andere Möglichkeit ist es, den Spieler, den Sie als Parameter inicialize erhalten möchten:

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); 
} 

Sie können eine Reihe von Spielern haben oder dinamically mit malloc zuordnen.

Verwandte Themen