2011-01-25 19 views
3

練習としてタイル(x、y、コスト、タイプ)を表す構造体の2次元配列を生成する関数を作成したかったのです。私はreallocとmallocを大量に使用していますが、出力は私が期待しているものではありません(例えば、壁を表す '#'文字は省略されています)。問題がどこにあるのかわかりません: - /。コードは次のとおりです。c struct、malloc、realloc issue

#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; 
} 

何が間違っていますか?

答えて

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

は私のように不器用な実際

switch (txt[m]) { 
+0

ああ、あるべき

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

switch (txt[i]) { 

でなければなりません。間違ったことを責めていた。ありがとう – fikson