2011-01-25 4 views
3

comme un exercice que je voulais créer une fonction qui génère un tableau 2d de structures qui représentent une tuile (x, y, coût, type). J'utilise beaucoup realloc et malloc, mais la sortie n'est pas ce que j'attends (par exemple le caractère '#' qui représente un mur est omis). Je ne peux pas trouver où le problème est: - /. Voici le code:c struct, malloc, realloc question

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int COL, ROW; 

struct Tile { 
    int x; 
    int y; 
    int cost; 
    char type[10]; 
}; 

struct Tile *** generate_map(char * txt) { 
    int i, j, m; 

    struct Tile ***col = (struct Tile***) malloc(sizeof (struct Tile**)); 
    struct Tile **row = (struct Tile**) malloc(sizeof (struct Tile*)); 
    struct Tile *t; 

    i = j = m = 0; 

    while (txt[m] != '\0') { 

     if (txt[i] == '\n') { 

      m++; 
      col[j] = row; 
      row = (struct Tile**) malloc(sizeof (struct Tile*)); 
      j++; 
      i = 0; 
      col = realloc(col, sizeof (struct Tile**) * (j + 1)); 
      continue; 
     } 

     t = (struct Tile*) malloc(sizeof (struct Tile)); 
     t->y = j; 
     t->x = i; 

     switch (txt[i]) { 
      case '#': 
       t->cost = 100; 
       strcpy(t->type, "wall"); 
       break; 
      case '.': 
       t->cost = 5; 
       strcpy(t->type, "sand"); 
       break; 
      case ',': 
       strcpy(t->type, "mud"); 
       t->cost = 10; 
       break; 
     } 

     row[i] = t; 
     i++; 

     row = realloc(row, sizeof (struct Tile*) * (i + 1)); 
     m++; 
    } 

    COL = j; 
    ROW = i; 
    return col; 
} 

int main(int argc, char** argv) { 
    char map[] = ".,.\n.,.\n.,.\n###\n.,."; 

    int i, j; 
    struct Tile ***k = generate_map(map); 

    for (i = 0; i < COL; i++) { 
     for (j = 0; j < ROW; j++) { 
      printf("x:%d y:%d, cost: %d, type: %s \n", (k[i][j])->x, (k[i][j])->y, (k[i][j])->cost, (k[i][j])->type); 
     } 
    } 


    return 0; 
} 

Avez-vous trouvé une erreur?

Répondre

4
if (txt[i] == '\n') { 

devrait être

if (txt[m] == '\n') { 

et

switch (txt[i]) { 

devrait être

switch (txt[m]) { 
+0

ah, en effet, si maladroit de moi. Je blâmais la mauvaise chose. Merci – fikson