2016-03-26 5 views
0

ich ein Brett so drucken möchten: enter image description hereC - wie der Wert des Zeigers drucken [0] [0] in einem 2D-Array

Und im gegebenen Code, ich diese Werte haben (unveränderbar Code):

#ifndef BOARD_H 
#define BOARD_H 

#define BOARD_WIDTH 10 
#define BOARD_HEIGHT 10 

typedef enum cell 
{ 
    EMPTY, //0 
    BLOCKED, //1 
    PLAYER //2 
} Cell; 

#define EMPTY_OUTPUT " " 

Cell BOARD_1[BOARD_HEIGHT][BOARD_WIDTH]; 
Cell BOARD_2[BOARD_HEIGHT][BOARD_WIDTH]; 

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]); 
void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]); 

ich habe versucht, wie der initialiseBoard() in vielerlei Hinsicht zu schreiben:

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]) 
{ 
    int i, j; 
    int *temp = NULL; 

    for (i = 0; i < 10; i++) 
     for (j = 0; j < 10; j++) 
      board[i][j] = EMPTY; 
} 

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]) 
{ 
    int i, j; 
    int *temp = NULL; 

    for (i = 0; i < 10; i++) 
     for (j = 0; j < 10; j++) 
     { 
      if (i == 0 && j == 0) 
      { 
       *temp = EMPTY; 
       board[0][0] = temp; 
      } 
      else 
       board[i][j] = EMPTY; 
     } 
} 

Weil ich die erste Zelle in der Platine an [0] [0] ist ein Zeiger wissen, so Ich habe viele Möglichkeiten ausprobiert Wert, aber es gibt immer eine Adresse zurück. Bitte werfen Sie einen Blick auf den folgenden Code und schlagen Sie mir einen Ansatz vor. Vielen Dank!

void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]) 
{ 
    int i, j; 
    for (i = 0; i <= 10; i++) 
    { 
     if (i == 0) 
     { 
      printf("\t|%s|", EMPTY_OUTPUT); 
      for (j = 0; j < 10; j++) 
       printf("%d|", j); 
      printf("\n"); 
     } 
     else 
     { 
      for (j = 0; j <= 10; j++) 
      { 
       if (j == 0) 
        printf("\t|%d|", i - 1); 
       else 
       { 
        char* c; 

        /*unsigned *p = &board[0][0]; 

        if (i == 1 && j == 1) 
         c = (*p == EMPTY) ? EMPTY_OUTPUT : "?";*/ 

        if (i == 1 && j == 1) 
         c = (board[0][0] == EMPTY) ? EMPTY_OUTPUT : "?"; 
        else 
         c = (board[i - 1][j - 1] == EMPTY) ? EMPTY_OUTPUT : "?"; 
        printf("%s|", c); 
       } 
      } 
      printf("\n"); 
     } 
    } 
    printf("\n%d\n", board[0][0]); 
} 

Wenn ich laufen Anzeigetafel(): enter image description here

Bei [0] [0], es gibt immer eine Adresse.

+0

Bitte erstellen Sie einen [minimalen Testfall] (http://stackoverflow.com/help/mcve). –

+0

Ein Zeiger _ist_ eine Adresse. Möchten Sie die Daten drucken, auf die dieser Zeiger zeigt? So wie es aussieht, haben Sie den Wert, den tmp zeigt, auf 0 gesetzt (LEER), Sie haben dann den Wert von [0] [0] auf die Adresse eingestellt, die tmp (ein Zeiger, _NOT_ der Wert LEER) liegt bei. – enhzflep

+0

Die erste Zelle unterscheidet sich nicht von anderen, so dass Sie nicht auf eine bestimmte Art und Weise damit umgehen müssen. Außerdem verkomplizieren Sie die Dinge, indem Sie die 0 in der Schleife zum Drucken der Rahmen verwenden. Drucken Sie sie einfach außerhalb der Schleife. Sie haben auch nicht gezeigt, wie Sie diese Funktionen aufrufen. –

Antwort

0

board[0][0] ist nur eine Basis-Adresse des 2D-Arrays und es druckt die Basisadresse des 2D-Arrays, wenn Sie an der Adresse drucken Wert wollen, dann sollten Sie '*' es verwenden, um den Wert an der Adresse in Ihrem Fall zeigt sollten Sie verwenden *((board+0)+0) können Sie versuchen, diese und lassen Sie mich wissen, ob es eine Frage ist :)

+0

Die letzte Aussage - können Sie das entfernen! Wenn du nicht 'verdammt sicher' bist, warum hast du dann die Antwort geschrieben? Überarbeiten Sie Ihre Antwort. – t0mm13b

+0

Es ist das gleiche wie 'Board [0] [0]' –

+0

Ich habe es versucht und habe diese Warnung beim Kompilieren: Format gibt den Typ 'int' aber das Argument hat den Typ 'Cell *' –

0

die erste initialiseBoard() Funktion ist die, die Sie verwenden möchten. Dadurch werden alle 2d-Array-Elemente auf EMPTY gesetzt.

Beachten Sie bei der Anzeige der Karte, dass die Adresse des Arrays selbst und die Adresse von [0] [0] dieselbe Adresse sind. Um den unter [0] [0] gespeicherten Wert zu sehen, dereferenzieren Sie das Array. Der im Array-Element gespeicherte Wert ist die Nummer, die der von Ihnen definierten Aufzählung entspricht.

unsigned *arrayAddress = &board[0][0]; 
    printf("2d array address is %p\n", arrayAddress); 

    int arrayElemContent = board[0][0]; 
    printf("2d array [0][0] content is %d\n", arrayElemContent); 

    board[0][0] = BLOCKED; 
    printf("blocked is %d\n", board[0][0]); 

In diesem Fall ist das Element, das man aus dem Array abzurufen ist ein int aus dem ENUM, die zuvor definiert sind, so dass Sie drucken es% d verwendet wird.

+0

Vielen Dank! –