2016-08-24 6 views
-4

Ich habe Probleme zu verstehen, was passiert. Der Wert des zweiten Tokens ist eine Zufallszahl anstelle von 1. Warum ist der Wert des zweiten Tokens nicht der Wert in der Funktion?Funktion Rückgabewert anders als erwartet

struct player 
{ 
char name[20]; 
enum cell token; 
unsigned score; 
}; 


BOOLEAN init_player2(struct player *second, enum cell token) 
{ 
    token = 1; 
} 

int main() 
{ 
    struct player second; 
    init_player2(&second, second.token); 
    printf("The value of second token is: %d\n", second.token); 

    return 0; 
} 
+2

'Token = 1;' hat keine Auswirkungen auf 'second.token'. Sie wollen 'second-> token = 1;' (das zweite Argument ist redundant). – Michael

+0

Außerdem sehe ich keine Notwendigkeit, den zweiten Parameter zu übergeben! – CinCout

+0

Es müssen Dutzende Fast-Duples für diesen einen sein, @CBegin sollten Sie beginnen, indem Sie ** SO nach vergleichbaren Fragen suchen, bevor Sie selbst fragen. – fvu

Antwort

4

C verwendet den Pass-by-Wert für die Übergabe von Funktionsargumenten.

In Ihrem Code wird second.token als Wert übergeben, so dass Änderungen, die innerhalb der Funktion vorgenommen werden, nicht zum Aufrufer führen.

Was Sie erwarten, ist der Code unten

void change(int x) 
{ 
     x = 10; 
} 

int main(void) 
{ 
    int p = 5; 
    change(p); 
    printf("%d\n", p); 
    return 0; 
} 

10 zu drucken, die einfach nicht möglich ist. (Wenn Sie den Anruf als change(15); machen, vorstellen, das Grauen.)

Lösung:

Sie müssen nicht separat das zweite Argument zu übergeben. Sie übergeben den Zeiger bereits an die Struktur, die die Variable enum enthält, verwenden Sie einfach den Zeiger, um den Wert in der aufgerufenen Funktion zu ändern, und drucken Sie dann im Aufrufer den Wert des Aufzählungsmembers der Strukturvariablen.

+1

Als die akzeptierte Antwort der dup-Staaten: C macht nie Pass-by-Reference. Es ist streng pass-by-Wert. In Bezug auf die Konstante: Python ist streng pass-by-reference, aber Sie können trotzdem ein Literal an eine Funktion übergeben. Und es funktioniert wie ein Zauber. Kein Horror! – Olaf

0
struct player 
{ 
char name[20]; 
enum cell token; 
unsigned score; 
}; 


BOOLEAN init_player2(struct player *second, enum cell token) 
{ 
    second->token= 1; 
} 

int main() 
{ 
    struct player second; 
    init_player2(&second, second.token); 
    printf("The value of second token is: %d\n", second.token); 

    return 0; 
} 

Sie müssen nur Variable der Struktur innerhalb der Funktion mit Zeiger verwenden, um den Wert zu ändern.

+0

Was ist die Verwendung des zweiten Arguments? – CinCout