2017-01-05 24 views
1

Brauchen Sie Hilfe zu verstehen, was ich falsch mache. Dies ist Teil einer Aufgabe, die ich durch Fernunterricht mache. Vielen Dank.Zeiger nicht auf ein Element eines Arrays von Strukturen setzen

Ich gebe einen Zeiger und eine Reihe von Spielern (2 Spieler). Wo Spieler sind eine Struktur:

struct player 
{ 
     char name[NAMELEN + 1]; 
     int score; /* count of number of pieces on the board */ 
     colour token_colour; 
}; 

struct player * play_game(struct player players[]) 
{ 
     gameboard board; 
     struct player * current, *other; 

     gameboard_init(board); 
     player_init(&players[0],1); 
     player_init(&players[1],2); 

     **randomize_game(players,current);** 

     /* replace this NULL return value with the appropriate return value */ 
     return NULL; 
} 

Ich versuche dann den Zeiger (curplayer) an den Spieler zu setzen, die die randomize Rolle gewann den ersten zu gehen. Ich gehe mit GDB durch und kann bestätigen, dass der Wert vor dem Befehl gleich ist. Bitte helfen Sie! erläutert, was im falsch zu machen:

curplayer= &players[0]; 

void randomize_game(struct player players[],struct player* curplayer) 
{ 
     int p; 
     time_t t; 

     srand((unsigned) time(&t)); 
     p = rand() % 2; 
     if(p==0){ 
       **curplayer= &players[0];** 
       players[0].token_colour = CC_WHITE; 
       players[1].token_colour = CC_RED; 
     }else{ 
       **curplayer= &players[1];** 
       players[0].token_colour = CC_RED; 
       players[1].token_colour = CC_WHITE; 
     } 

}

Dank

+1

Klassische pitfall: 'randomize_game (Spieler, Strom),' kann überhaupt nicht ändern 'current'. Parameter werden nach Wert in C übergeben. –

+0

Gleiches Problem wie hier erklärt [http://stackoverflow.com/questions/39486797/dynamic-memory-access-only-works-inside-function]. – Lundin

Antwort

0

Sie wollen current ändern, aber curplayer ist ein Zeiger, der auf randomize_game lokal ist, wird es nur mit dem Wert initialisiert in current. Jede Änderung, die Sie daran vornehmen, wird nicht auf current in play_game angewendet.

Wenn Sie eine Variable aus einem aufrufenden Kontext ändern möchten, müssen Sie ihre Adresse übergeben. Dies gilt auch für Zeiger.

void randomize_game(struct player players[],struct player **curplayer) 
{ 
     int p; 
     time_t t; 

     srand((unsigned) time(&t)); 
     p = rand() % 2; 
     if(p==0){ 
       *curplayer= &players[0]; 
       players[0].token_colour = CC_WHITE; 
       players[1].token_colour = CC_RED; 
     }else{ 
       *curplayer= &players[1]; 
       players[0].token_colour = CC_RED; 
       players[1].token_colour = CC_WHITE; 
     } 
} 

Natürlich müssen Sie ändern, wie Sie die Variable übergeben:

randomize_game(players, &current); 
+0

Ich habe diese Änderungen vorgenommen, aber der Wert wird immer noch nicht aktualisiert. Hier ist das GCD-Debugging. Unmittelbar nach dem, ob statment in randomize_game: (GDB) drucken curplayer $ 1 = (struct Spieler **) 0x0 (gdb) print * curplayer nicht Speicher an der Adresse 0x0 – ClintB

+0

@ClintB zugreifen kann - meine bearbeiten sehen. Und beachten Sie ab jetzt die Warnungen Ihres Compilers. – StoryTeller

+0

Legende! Ich habe es funktioniert. Seit Stunden hier feststecken. Vielen Dank. Zu Ihrer Information: Ich habe eine Menge Warnungen, weil so viele ungenutzte Variablen auftauchen, also ignorierte ich die Warnungen im Moment. Lektion gut und wirklich gelernt. – ClintB

Verwandte Themen