3

as an exercise I wanted to create a function that generates a 2d array of structs that represent a tile (x, y, cost, type). I am using realloc and malloc heavily, but the output is not what I am expecting (for example the '#' character that represents a wall is being omitted). I can't find where the issue is :-/. Here is the code:

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

Any ideas what got wrong?

1 Answer 1

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

should be

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

and

switch (txt[i]) {

should be

switch (txt[m]) {
Sign up to request clarification or add additional context in comments.

1 Comment

ah, indeed, so clumsy of me. Was blaming the wrong thing. Thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.