Программа C: квадратные скобки при печати двумерного массива символов - PullRequest
1 голос
/ 10 сентября 2010

У меня запутанная проблема - по крайней мере, для меня это может быть очень просто, и я что-то упускаю.Я пытаюсь инициализировать двумерный массив переменного размера, массив является частью структуры.У меня нет проблем с выделением памяти для массива, но когда я пытаюсь назначить символы массиву или распечатать их, я получаю неожиданные результаты = /

Моя последняя попытка показала, что независимо от того, когда я назначаю символ длябудет напечатан массив [[] ... это был первый раз, когда я действительно смог напечатать что-нибудь .Мои предыдущие попытки вернули ошибки сегмента.Вот код, что мне не хватает.Спасибо.

typedef struct world_map {
    char ** map_array;
    int X, Y;
} MAP_s;
//
MAP_s * map;

int init_map_array(void) {
    int i; // temp
    map = malloc(sizeof (MAP_s));
    map->X = 20; // Columns
    map->Y = 10; // Rows
    //
    map->map_array = malloc(map->Y * (sizeof (char *)));
    //
    if (map->map_array == 0) {
        printf("ERROR: out of memory!");
        return -1;
    } else {
        for (i = 0; i < map->Y; ++i) {
            map->map_array[i] = malloc(map->X * sizeof (char));
            if (map->map_array[i] == 0) {
                printf("ERROR: out of memory!");
                return -1;
            }
        }
    }
    int curr_pos_x, curr_pos_y;
    int limit_x = map->X;
    int limit_y = map->Y;
    //
    for (curr_pos_y = 0; curr_pos_y < limit_y; ++curr_pos_y) {
        for (curr_pos_x = 0; curr_pos_x < limit_x; ++curr_pos_x) {
            map->map_array[curr_pos_y][curr_pos_x] = "#";
        }
    }
    return 1;
}

int draw_map(void) {
    int curr_pos_x, curr_pos_y;
    int limit_x = map->X;
    int limit_y = map->Y;
    //
    for (curr_pos_y = 0; curr_pos_y < limit_y; ++curr_pos_y) {
        for (curr_pos_x = 0; curr_pos_x < limit_x; ++curr_pos_x) {
            printf("%c", map->map_array[curr_pos_y][curr_pos_x]);
        }
        printf("\n");
    }
}

int main(void) {
    init_map_array();
    draw_map();
    //
    printf("STRUCT: %i\n", sizeof (map));
    printf("X: %i\n", sizeof (map->X));
    printf("Y: %i\n", sizeof (map->Y));
    printf("ARRAY: %i\n", sizeof (map->map_array));
return (EXIT_SUCCESS);
}

В качестве примечания, все эти 4 printf в конце все возвращают "4", я вполне уверен, что если структура содержит 3 элемента, каждый из которых 4 байта, то это должно бытьбольше чем 4 байта ...

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Кажется, работает нормально для меня, но есть одна ошибка (как-то мой GCC был "умным" достаточно, чтобы справиться с этим, но это все еще ошибка):

map->map_array[curr_pos_y][curr_pos_x] = "#";

Это присваивает char * (указатель на символ в сегменте данных) вместо символа, что, конечно, приведет к появлению странных символов.Измените "#" на '#', и оно должно работать.

Кроме того, относительно ваших printf s в конце: они должны выглядеть следующим образом:

printf("STRUCT*: %lu\n", sizeof (map)); // Prints sizeof(MAP_s *) == sizeof(void *) == 4;
printf("STRUCT: %lu\n", sizeof (*map)); // Prints sizeof(MAP_s) == 16 on my system (iMac w/ Mac OS X),
        // alignment and native pointer size might give you different values.
printf("X: %d\n", map->X); // Prints the X dimension. No sizeof.
printf("Y: %d\n", map->Y); // Prints the Y dimension. No sizeof.

Вы не можетеprint Размер map->map_array, поскольку sizeof работает во время компиляции и может возвращать константы только для типов, размер которых известен во время компиляции.Единственный способ определить размер map_array - сохранить заданный вами аргумент размера malloc в переменной.

1 голос
/ 10 сентября 2010

Попробуйте

map->map_array[curr_pos_y][curr_pos_x] = '#';

вместо

map->map_array[curr_pos_y][curr_pos_x] = "#";

map->map_array[curr_pos_y][curr_pos_x] имеет тип char, и вы присваиваете ему строковую константу.

...