2016-06-14 11 views
0

Ich versuche, ein (10x10) 2-dimensionalen Zeichen-Array zu erstellen zu speichern entweder '' und 'T' und zeigt es wie diese2-dimensionale Array Manipulation

+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 

Die Funktion schrieb ich:

int plant_forest(char forest[][SIZE]) 
{ 
    int i,j; 
    forest[0][0] = ' '; 
    for(i = 0;i<SIZE;i++) 
    { 
     for(j=0;j<SIZE;j++) 
     { 
      if(forest[i][j]!= forest[0][0]) 
      { 
       if(forest[i][j-1]!='T' && forest[i-1][j]!= 'T') 
       { 
        forest[i][j] = 'T'; 
       } 
       else 
       { 
        forest[i][j] = ' '; 
       } 

      } 
     } 
    } 
    return 0; 
} 

Das Ergebnis, das ich bekam, war etwas anders.

+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
| | |T| |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
|T| | |T| |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| | |T| |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| | |T| |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| | |T| |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| | |T| |T| 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| | |T| | 
+-+-+-+-+-+-+-+-+-+-+ 
|T| |T| |T| |T| | |T| 
+-+-+-+-+-+-+-+-+-+-+ 
| |T| |T| |T| |T| | | 
+-+-+-+-+-+-+-+-+-+-+ 

ich die Logik überprüft und nichts finden konnte. Außer von i-1 und j-1 könnte negative Zahl sein. Aber wie würde das die Ausführung beeinflussen?

Nur als Referenz, ich werde hier die Druckfunktion enthalten. Aber ich habe bereits überprüft und sicher, dass es kein Fehler war in dieser Funktion

void printBoard(char forest[][SIZE]) 
{ 
    int i,j; 

     printf("+-+-+-+-+-+-+-+-+-+-+\n"); 
     for(i = 0; i<SIZE;i++) 
     { 
      for(j = 0;j<SIZE;j++) 
      { 
       printf("|%c",forest[i][j]); 
      } 
      printf("|\n"); 
      printf("+-+-+-+-+-+-+-+-+-+-+\n"); 

     } 

} 
+2

'[j-1]' - aber 'j' beginnt bei 0! Ganz abgesehen von '[0] [0]' 'forest' ist nicht initialisiert. Was Sie haben, sieht massiv über kompliziert (und ziemlich buggy) aus, nur um ein "Schachbrett" zu bekommen. – John3136

+0

Forest wird in der Hauptfunktion initialisiert. –

+0

Um ein Schachbrett zu machen: 'Wald [i] [j] = (i + j) & 1? 'T': ''; ' – user3386109

Antwort

1

denke ich, könnte dies mit dem zu tun hat, wie die Daten in dem Array gespeichert ist. Im Speicher werden die Daten nur sequentially gespeichert. Seit negative array indexes are allowed in C das funktionale Ergebnis in Ihrem Fall ist, dass Wald [1] [- 1] auf die gleichen Daten in der Zelle Wald [0] [9] zeigt, die Sie bemerken werden, ist "T".

Weil Wald [0] [9] (auch bekannt als Wald [1] [- 1]) ist 'T', scheitern Sie diesen Test

if(forest[i][j-1]!='T' && forest[i-1][j]!= 'T') 

was bedeutet, dass ein '' in Zelle Wald registriert ist [1] [0] stattdessen. Verhindern Sie negative Indexwerte, und Sie sollten gut sein.

0

Sie denken möglicherweise über die Logik nach, die Sie verwenden, um das forest Array in plant_forest zu füllen. Alles, was Sie die 'T' und ' ' Elemente staffeln müssen verwendet forest zu füllen ist eine Überprüfung, ob die Index äußere Schleife 'i'ungerade oder gerade ist und starten Sie mit auf das Ergebnis entweder eine 'T' oder ' ' Basis zu füllen. Dann nur Toggle zwischen 'T' und ' ' für jeden 'j' Index. Zum Beispiel:

int plant_forest (char (*forest)[SIZE]) 
{ 
    if (!forest) return 1;    /* validate pointer */ 
    int i, j; 

    for (i = 0; i < SIZE; i++) { 
     int t = i & 1; 
     for (j = 0; j < SIZE; j++) /* simple toggle 'T' or ' ' */ 
      forest[i][j] = t ? 'T' : ' ', t ^= 1; 
    } 
    return 0; 
} 

Sie können die Ergebnisse mit einem einfachen Stück Code testen:

#include <stdio.h> 

#define SIZE 10 

int plant_forest (char (*forest)[SIZE]) 
{ 
    if (!forest) return 1;    /* validate pointer */ 
    int i, j; 

    for (i = 0; i < SIZE; i++) { 
     int t = i & 1; 
     for (j = 0; j < SIZE; j++) /* simple toggle 'T' or ' ' */ 
      forest[i][j] = t ? 'T' : ' ', t ^= 1; 
    } 
    return 0; 
} 

int main (void) { 

    char arr[SIZE][SIZE] = {{0}}; 

    if (!plant_forest (arr)) { 
     int i, j; 
     for (i = 0; i < SIZE; i++) { 
      for (j = 0; j < SIZE; j++) 
       putchar (arr[i][j]); 
      putchar ('\n'); 
     } 
    } 
    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/plant 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 
T T T T T 

Wenn Sie Fragen haben oder wenn Ich habe Ihre Frage missverstanden, lassen Sie es mich wissen. (Ich überlasse es Ihnen, um alle zusätzlichen '|' Formatierung, die Sie mögen mögen).

Sie sogar eine einzige Zeile Code speichern, wie in plant_forest in den Kommentaren von anding die Summe von i und j, erwähnt zu wählen zwischen 'T' oder ' ' Zuordnung z

In beiden Fällen wird sichergestellt, dass Ihr forest Array korrekt ausgefüllt ist.