2016-06-30 4 views
0

Ich bin ein Anfänger bei C und erstellen Sie dieses Programm, um mir zu helfen, zu lernen. Zweck ist, Fußballspieler einem Team hinzuzufügen und Info auszudrucken.Druckfelder der Struktur in c (dynamische Speicherzuweisung)

Ich versuche, Felder meiner Club-Struktur zu drucken, aber wenn mein Programm zu meiner Druckmethode kommt, sind alle meine Werte Müll oder Adressen. Wie kann ich "echter" Wert

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

#define SIZE 8 

typedef struct player { 
    int id; 
    char *position; 
} Player; 

typedef struct club { 
    int size; 
    Player *team[SIZE]; 
} Club; 


Player *create_player(int id, const char *description); 
void create_team(Club *club); 
void print_club(const Club *club); 
void add_player_to_club(Club *club, int id, const char *position); 



int main() { 
    Club club; 

    create_team(&club); 
    add_player_to_club(&club, 1, "forward"); 
    add_player_to_club(&club, 2, "goalie"); 
    print_club(&club); 

    return 0; 
} 

Player *create_player(int id, const char *description){ 

    Player *player; 

    player = malloc(sizeof(Player)); 

    if(description == NULL){ 
     player->position = NULL; 

    } else { 
     player->position = malloc(strlen(description) + 1); 
     strcpy(player->position, description); 
     player->id = id; 
    } 
    return player; 
} 

void create_team(Club *team){ 

    team = malloc(sizeof(Club)); 

    if (team == NULL) { 
     return; 
    } else { 
     team->size = 0; 
    } 
} 
void print_club(const Club *club) { 

    int i = 0; 

    if (club == NULL) { 
     return; 
    } else if (club->size == 0) { 
     printf("No team members\n"); 
    } else { 
     for (i = 0; i < SIZE; i++) { 
      printf("Id: %d Position: %s\n", club->team[i]->id, 
        club->team[i]->position); 
     } 
    } 
} 
void add_player_to_club(Club *club, int id, const char *position){ 


    if (club == NULL || club->size >= SIZE) { 
     return; 
    } else { 
     Player player = *create_player(id, position); 

     club->team[club->size -1] = &player; 

    } 
} 

Hier ist ein Bild von meiner Bugsitzung

Debugger

+0

Blick auf die Antwort unten. Trotz einiger Fehler ist die Gesamtstruktur Ihres Codes in Ordnung. –

Antwort

1

Problem 1

create_team bekommen ist nicht etwas Nützliches für main tun. Sie ändern den Wert einer lokalen Funktion-Funktion. Als Konsequenz bleibt club in main nicht initialisiert. Sie fahren fort, es zu verwenden, als ob es ein gültiges Objekt ist, was Ursache für undefiniertes Verhalten ist.

können Sie diese Funktion ändern:

void create_team(Club *team){ 
    team->size = 0; 
    for (int i = 0; i < SIZE; ++i) 
    { 
     team->team[i] = NULL; // Unfortunate choice of variable names 
          // but should be OK. 
    } 
} 

Problem 2

Sie sind in add_player_to_club einen Zeiger auf eine Funktion lokalen Variable zu speichern. Dieser Zeiger wird ungültig, die Funktion kehrt zurück.

Player player = *create_player(id, position); 
    club->team[club->size -1] = &player; // Problem 

Ändern Sie es an:

club->team[club->size] = create_player(id, position); 
    club->size++; 

Problem 3

Sie drucken können auch Player s in print_club. Es gibt nicht immer SIZE Nummer von Player s im Team. Ändern Sie die Zeile

for (i = 0; i < SIZE; i++) { 

zu

for (i = 0; i < club->size; i++) { 
+0

Sollte es nicht 'Club-> Team [Club-> Größe]' statt 'Club-> Team [Club-> Größe -1]' sein? Und 'club-> size' sollte inkrementiert werden, und der Inhalt von' create_team' sollte eigentlich nur 'team-> size = 0 sein;' –

+0

@MichaelWalz, yes. 'size' muss gleich danach erhöht werden. –

+0

@MichaelWalz, alles zu initialisieren ist eine gute Übung. Das ist IMHO. –