2017-01-23 21 views
0

Dies ist mein erster Stackoverflow-Post.CS50-Zeichenfunktion zeichnet nur Nullen

Ich tue dem CS50 Kurs auf edx und zur Zeit bin ich bei Problem steckt 3. Setzen mir das Spiel von fünfzehn umzusetzen. Die init() - Funktion initialisiert das Board und die Draw-Funktion sollte es zeichnen, aber es gibt ein Problem.

Die Zeichenfunktion ruft nicht die Werte der Funktion init() ab. Ich habe damit experimentiert, in der Funktion init() sind die Werte korrekt, aber in der Zeichenfunktion sind alle von ihnen Nullen.

Was ist das Problem?

/** 
* Initializes the game's board with tiles numbered 1 through d*d - 1 
* (i.e., fills 2D array with values but does not actually print them). 
*/ 
void init(void) 
{ 
    //initializing the board 
    int board[d][d]; 
    int x = (d*d) -1; 
    //this loop goes trough each row 
    for(int i = 0; i < d; i++){ 
     //this goes trough each column 
     for(int j = 0; j < d ; j++){ 
      //this condition handles the case of swapping the 2 and 1 when the grid is even 
      if((d % 2) == 0 && (x == 2)){ 
       //assigning the number 1 
       board[i][j] = x-1; 

       //going to the next column 
       j++; 

       //assigning the number 2 
       board[i][j] = x; 

       //setting the x = 0 so the loop can end 
       x=0; 
      } 
      //this happens if the above conditions are not met 
      else { 
       //assigning the value to the grid 
       board[i][j]= x; 

       //decrementing the value 
       x--; 
      } 
      //ending the loop 
      if(x == 0){ 
       break; 
      } 
     } 
     //ending the loop after the last tile is initialized 
     if(x == 0){ 
      break; 
     } 
    } 
} 
/** 
* Prints the board in its current state. 
*/ 
void draw(void) 
{ 
    for(int i = 0; i < d; i++){ 
     for(int j = 0; j < d; j++){ 
      if(board[i][j] != 0){ 
       printf("%2i", board[i][j]); 
      } else { 
       printf("_"); 
      } 
     } 

    printf("\n");  

    } 
+2

'void init (void) { // Initialisierung der Karte int board [d] [d];' diese 'board' ist lokal. – BLUEPIXY

+0

Das löste es, danke: D –

Antwort

1

Ihre board[][] ist eine lokale Variable und somit nur die Arbeit im Innern der init() Umgebung.

ich die CS50x natürlich auch nehmen, und die fifteen.c Datei, die sie uns behandeln tatsächlich bereits eine board[][] Variable in Zeile 27 deklariert: int board[DIM_MAX][DIM_MAX];, die bereits global ist.

So brauchen Sie nicht ein anderes Board zu erstellen, verwenden Sie einfach die, den sie uns behandeln.

+0

Ja, ich habe es bemerkt, danke: D –

1

Dies könnte Ihnen helfen: https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm

Im Grunde alles, was Sie in Ihrer init-Funktion tun (Variablennamen & Werte) sind in dieser Funktion oder Block gültig.

Um dies zu lösen, die Sie entweder int board[d][d]; eine globale Variable, indem sie es über die Hauptfunktion declairing wie so machen kann (dringend abgeraten!):

int board[d][d]; 

int main(int argc, char** argv){ ... } 

oder Sie könnten die Varibale board[d][d] als Hinweis auf Ihre Funktion geben draw. Dies funktioniert, ist aber ineffizient, weil die gesamte Variable kopiert wird.

void draw(int board[][]){...} 

ODER Sie können mithilfe der c Befehl malloc siehe man malloc für board[d][d] auf dem Heap-Speicher zuweisen. Dann sollte Ihr Code in etwa so aussehen.

void *ptr = malloc(sizeof(board)); //you need to error check this. See man malloc 

Wenn Sie das tun, müssen Sie nur den Zeiger an die Daten in Ihrer Funktion übergeben. Dies ist effizienter, da die Daten im Heapspeicher verbleiben.

+0

Arays zerfallen zu Zeigern, wenn sie an Funktionen übergeben werden, so dass die Karte beim Übergeben nicht kopiert wird. Das Übergeben eines mehrdimensionalen Arrays hat Vorbehalte, siehe http://stackoverflow.com/questions/2828648/how-to-pass-a-multidimensional-array-to-a-function-in-c-and-c –

+0

Ok, habe ich nicht weiß das. Vielen Dank! Aber auch in seinem Fall? Ich dachte, dass alles, was du auf dem Funktionsstack machst, verloren geht, sobald die Funktion beendet wird, also muss C die Daten sowieso kopieren. –

Verwandte Themen