2010-07-30 16 views
6

Oto moje problematyczne kodowanie: Muszę wziąć imię 2 gracza. Następnie, gdy w następnej części, gdy znacznik gracza zmieni nazwę zapisaną w "currentPlayer", należy zmienić również nazwę zapisaną w playerOne lub playerTwo. Tak nie jest, jak to naprawić? Proszę rozwiązać, próbowałem uczynić go zmienną odniesienia z symbolem &, ale pojawia się błąd mówiąc, że tablica odniesienia nie jest dozwolone.Przekazywanie tablicy znaków w funkcji?

void boardMarker(int &, char playerOne[], char playerTwo[], char &playerMarker, char currentPlayer[]); 

int main() 

{ 
    char playerOne[100]; 
    char playerTwo[100]; 
    char currentPlayer[100] = "playername"; 

    boardMarker(playerTurn, playerOne, playerTwo, playerMarker, currentPlayer); 

} 
void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char currentPlayer[100]) 
{ 
    // Set player markers 
    //Player 1 uses X and Player 2 uses O 
    if (playerTurn == 1) 
    { 
     playerMarker = 'X'; 
     currentPlayer = playerOne; 
    } 
    else 
    { 
     playerMarker = 'O'; 
     currentPlayer = playerTwo; 
    } 
} 
+2

ktokolwiek inny głosował, to było niewłaściwe. To dobrze napisane pytanie. – abelenky

+0

Nie wiem nawet, jak powiedzieć, jak nieprawidłowo wygląda twój kod. Czy to się kompiluje?!?!?! Na przykład jako parametr użyto zmiennej o nazwie playerTurn, która nigdy nie została zadeklarowana. – karlphillip

+2

w takim przypadku, dlaczego nie awansowałeś, aby wyrównać wynik? – catchmeifyoutry

Odpowiedz

5
  • Nie można przypisać tablic do siebie (trzeba je skopiować element po elemencie)
  • Kiedy przekazywane do funkcji, tablice wskaźników do zaniku, więc jako argument, char playerOne[100] jest identyczna char* playerOne
  • Przypisanie numeru char* do innego char* nie powoduje skopiowania ciągu znaków, ale kopiuje wskaźnik.

Poprawny sposób to zrobić:

currentPlayer = playerOne; 

to:

strcpy(currentPlayer, playerOne); 

Albo, jeszcze lepiej, ponieważ jest to C++ i nie C, użyj std::string zamiast char tablic. std::string będzie zachowywać się tak, jak się spodziewasz.

0

w C/C++ nazwa tablicy jest rzeczywiście wskaźnik do pierwszego elementu tablicy. Tak na przykład

*currentPlayer == 'p' 

Teraz, kiedy jesteś przechodzącą tablicę do funkcji takiego, robisz kopię wskaźnika, ale nie sama tablicy.

Więc kiedy w funkcji mówisz

currentPlayer = playerOne 

Wszystko robisz sprawia, że ​​punkt wskaźnik currentPlayer do tej samej lokalizacji pamięci jako playerOne wskaźnika.

Aby dostać co chcesz, musisz użyć StrCpy

strcpy(currentPlayer,playerOne) 
+0

Tablice nie są wskaźnikami, nie będę głosował, ponieważ jest to powszechne nieporozumienie, ale powinieneś przejrzeć zarówno swoją wiedzę, jak i odpowiedź. Nazwa tablicy ** jest ** identyfikatorem, który odnosi się do tablicy, zamieszanie wynika z faktu, że tablice mają tendencję do * rozpadu * do wskaźników w większości wyrażeń i faktu, że język pozwala na składnię tablicową w kilka miejsc, w których jest on parsowany jako składnia wskaźnika (tj. parametr funkcji "int a [10]" jest analizowany jako "int *", ale tablice są nadal tablicami w zakresie, w którym są zdefiniowane i mogą być używane jako takie w miejscach, gdzie wskaźniki nie mogą być następujące: –

+0

Przykładem może być "void foo (int (& a) [3]);. Funkcja ta pobiera tablicę dokładnie 3 wzorców przez odniesienie.' int main() {int array [3]; int * p = tablica; foo (tablica);/* foo (p); * /} '. tablica' może być przekazana do' foo' jako * to jest * tablica z 3 liczbami całkowitymi, 'p' nie może, ponieważ jest wskaźnikiem do liczby całkowitej (zdarza się, że zostanie zainicjalizowana na początku tablicy 3 liczb całkowitych). –

+1

Mówienie, że tablice są wskaźnikami, jest częstym sposobem wytłumaczenia ich ludziom, którzy mogą być nowi w C, ponieważ se sprawia, że ​​wiele ich "dziwnych" zachowań ma więcej sensu. Prawdopodobnie powinienem był wyjaśnić, że tablice działają jak wskaźniki, ale nie są dokładnie takie same. BTW, nie jestem pewien, czy kiedykolwiek napisałem kod jak w twoim przykładzie. Wiedziałem, że sizeof (tablica) była inna. –

1

chcesz currentPlayer być wskaźnik do znaków, następnie zamienić go między dwoma graczami:

Twój kod, edytowany:

void boardMarker(int&, char playerOne[], char playerTwo[], char &playerMarker, char** pCurrentPlayer); 

int main() 
{ 
    char playerOne[100]; 
    char playerTwo[100]; 
    char* currentPlayer = playerOne; 

    boardMarker(playerTurn, playerOne, playerTwo, playerMarker, &currentPlayer); 

} 
void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char** pCurrentPlayer) 
{ 
    // Set player markers 
    //Player 1 uses X and Player 2 uses O 
    if (playerTurn == 1) 
    { 
     playerMarker = 'X'; 
     *pCurrentPlayer = playerOne; 
    } 
    else 
    { 
     playerMarker = 'O'; 
     *pCurrentPlayer = playerTwo; 
    } 
} 

Niektóre commen ts na kodzie:

  • zmienne playerTurn i playerMarker nie są deklarowane. (Udaję, że są to zmienne globalne , nie pokazane tutaj).
  • Nie powinieneś zostawiać parametrów nienazwanych, takich jak zwisające int& w prototypie boardMarker.
  • Jak napisano, playerOne i playerTwo są niezainicjowane. Udawajmy, że są inicjowane gdzie indziej.
+0

Da to efekt, który chce, ale zmienia semantykę swojego programu. 'currentPlayer' jest teraz aliasem do jednego z ciągów nazw graczy, zamiast utrzymywania wartości bieżącej nazwy gracza. –

Powiązane problemy