2016-05-12 6 views
-4

Ich habe ein Problem mit den fettgedruckten Variablen. CLion sagte, dass auf diese Parameter niemals zugegriffen wird.Wie übergibt man lokale int-Variablen als Parameter an eine Funktion?

Wenn ich die Funktion open_turn aufrufen, werden die turn_face und turn_suit gesagt, dass sie nicht initialisiert wurden. Aber ich möchte diese Variablen nicht initialisieren, indem ich ihnen Werte zuweise, da die Werte erst nach dem Aufruf der Funktion ermittelt werden.

Wie gehe ich int turn_card, int turn_f und int turn_s in die Funktion open_turn? Dann Zuweisung Wert von int turn_card zu int wiederum, int turn_f zu int turn_face und int turn_s zu turn_suit?

P/s: In diesem Moment Parameter int turn_f und int turn_s sagte deklariert werden, aber nie abgerufen.

+0

Können Sie an den Compiler Ausgabe beziehen sich nicht? –

+0

Wo verwenden Sie die Variablen 'turn_s' und' turn_f'? –

+0

Wenn Sie nur Turn_s und Turn_f-Werte in der Funktion zuweisen, warum müssen Sie sie überhaupt übergeben? Oder erwarten Sie, dass sie von der Funktion zurückgegeben werden? In diesem Fall müssen Sie Zeiger auf Ints und nicht auf Ints übergeben. – OldBoyCoder

Antwort

0

Wenn Sie einen Wert von einer Funktion in C zurückgeben möchten, müssen Sie einen Zeiger auf die Variable übergeben. Zum Beispiel:

#include <stdio.h> 
void f(int x, int *p) { 
    x = 0; /* This only affects local param x */ 
    *p = 5; /* copies x's value into variable pointed to by p */ 
} 

int main() { 
    int a = 1, b = 2; 
    f(a, &b); /* a passed by value, b's address is passed */ 
    printf("a = %d, b= %d\n", a, b); /* prints out a = 1, b = 5 */ 
} 

Hier ist der Compiler könnte warnen, dass die x Variable in der Funktion f ein Wert zugewiesen wird, die nicht zugegriffen wird, da es auf 0 setzen nicht auf a in main beeinflussen war. *p = 5 hat keine Warnung erstellt, weil sie den Wert von b beeinflusst, der dann im printf-Aufruf verwendet wird.

1

Sie machen das alles falsch. Wenn Sie in ein Argument an eine Funktion übergeben, übergeben Sie eine Kopie der Variablen als Wert. Das Ändern der Variablen in der Funktion hat keine (nützliche) Auswirkung, da Sie nur eine temporäre Kopie der Variablen ändern, die nach Beendigung des Funktionsaufrufs verworfen wird. Der Compiler hat das Recht, Fehler zu bannen. Um das zu erreichen, was Sie wahrscheinlich tun möchten, müssen Sie Zeiger verwenden, die Sie immer noch initialisieren müssen.

Beachten Sie, dass Sie wahrscheinlich immer noch Fehler in Ihrem Code haben, da Sie uns nicht gezeigt haben, wie current_deck definiert ist.


Code Listing


/******************************************************************************* 
* Preprocessor directives. 
******************************************************************************/ 
#include <stdio.h> 


/******************************************************************************* 
* Function prototypes. 
******************************************************************************/ 
void open_turn(int current_deck[], int turn_card, int turn_f, int turn_s); 


/******************************************************************************* 
* Function definitions. 
******************************************************************************/ 
int main(void) 
{ 
    int turn; 
    int turn_face; 
    int turn_suit; 
    open_turn(deck, &turn, &turn_face, &turn_suit); 

    /* The following also works. */ 
    int* pTurn = &turn; 
    int* pTurn_face = &turn_face; 
    int* pTurn_suit = & turn_suit; 
    open_turn(deck, pTurn, pTurn_face, pTurn_suit); 

} 

void open_turn(int current_deck[], int* turn_card, int* turn_f, int* turn_s) 
{ 
    if (!turn_card || !turn_f || !turn_s) 
    { 
     printf("Invalid input.\n"); 
     return; 
    } 

    *turn_card = current_deck[card_idx++]; 
    *turn_f = turn_card%13; 
    *turn_s = turn_card/13; 
} 
+0

Ich hatte kein Problem mit dem Array current_deck [], weil Arrays immer als Zeiger behandelt werden, wenn sie an eine Funktion als Parameter übergeben werden, ist das richtig? –

+0

@JasonBui [nicht wirklich.] (Https://stackoverflow.com/questions/12676402/why-cant-i-treat-an-array-like-a-pointer-in-c). Wenn das Problem durch die obige Antwort behoben wurde, sollten Sie es als "akzeptiert" markieren. – DevNull

+0

Dann brauche ich keinen Zeiger für das Array? –

Verwandte Themen