2016-03-27 3 views
0

Я нахожусь на кривой обучения указателя и действительно могу использовать какое-то направление/помощь. Я хочу иметь массив структур, причем каждая структура является «ячейкой», которая отслеживает различные вещи. Все, кажется, работает нормально, не компилирует ошибки или что-то еще, и я использую массив для создания карты. Проблема возникает, когда я пытаюсь получить доступ к массиву в разных точках. Иногда я получаю нарушение доступа к памяти, иногда я этого не делаю - это значит, что мне повезет. Я очень новичок в C, поэтому любая помощь приветствуется - или указывая в правильном направлении. Я действительно хочу понять, почему и где я ошибся, и у меня такое чувство, что это мои указатели и память - я правильно передаю вещи? Заранее спасибо.Нарушение памяти, доступ к массиву структур

#define ysize 20 
#define xsize 80 

typedef struct cells { 
    int type; 
    bool visited; 
    bool passable; 
    int item; 
} cells; 

int getCell(int x, int y, struct cells **map) 
{ 
    return map[x + xsize * y]->type; 
} 
void setCell(int x, int y, int celltype, struct cells **map) 
{ 
    map[x + xsize * y]->type = celltype; 
} 
struct cells **makeMap() 
{ 
    struct cells **map = malloc(xsize * ysize * sizeof(struct cells *)); 
    for (int i = 0; i != xsize * ysize; i++) { 
     map[i] = malloc(sizeof(struct cells)); 
     map[i]->type = 0; 
     map[i]->item = 0; 
     map[i]->passable = true; 
     map[i]->visited = false; 
    } 
    return map; 
} 


void main() 
{ 
    struct cells ** map = makeMap(); 
    //getRand generates a random number between the min and max supplied. 
    int x = getRand(0, xsize); 
    int y = getRand(0, ysize); 

    if (getCell(x, y, map) == tileCorridor || getCell(x, y, map) == tileDirtFloor){ 
     //map[x + xsize * y]->item = 3; 
     //printf("%d", getCell(x, y, map)); 
    } 
    // this is where the code is failing. 
    //sometimes it works, others it generates a memory error 

    destroyMap(map); 
} 
+0

каких значения х, у: опубликовать [Minimal, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – Thomas

+0

'void main()' 'int main()' – stackptr

+0

Вы, кажется, путаетесь, хотите ли вы 1-мерную карту, где вы вычисляете индекс 'struct' из его координат или 2- D, где у вас есть 1-D массив указателей на другие 1-D массивы 'struct'. В первом случае вам не нужны 2 звезды (если вы не хотите устанавливать указатель через аргумент функции вместо возвращаемого значения функции). –

ответ

0

Поскольку вы делаете вычисление индекса в одномерное, вам не нужен двумерный массив. Вот фукциональная версия вашего кода. Я импровизировал getRand и удалил destroyMap, оба из которых все еще отсутствовали и добавили входящие.

Поскольку в основном работает код, возможно, ошибка была в другом месте. Возможно, ваши показатели были вне пределов.

#include <malloc.h> 
#include <stdlib.h> 

#define ysize 20 
#define xsize 80 

typedef struct cells { 
    int type; 
    bool visited; 
    bool passable; 
    int item; 
} cells; 

int getCell(int x, int y, struct cells *map) 
{ 
    return map[x + xsize * y].type; 
} 
void setCell(int x, int y, int celltype, struct cells*map) 
{ 
    map[x + xsize * y].type = celltype; 
} 
struct cells *makeMap() 
{ 
    struct cells *map = (cells*) malloc(xsize * ysize * sizeof(struct cells)); 
    for (int i = 0; i != xsize * ysize; i++) { 
     map[i].type = i; 
     map[i].item = 0; 
     map[i].passable = true; 
     map[i].visited = false; 
    } 
    return map; 
} 


int main() 
{ 
    struct cells * map = makeMap(); 
    //getRand generates a random number between the min and max supplied. 

    for(int i = 0; i < 10000; ++i) 
    { 
     int x = rand() % xsize; 
     int y = rand() % ysize; 

     int tileCorridor = 21; 
     int tileDirtFloor = 143; 


     if (getCell(x, y, map) == tileCorridor || getCell(x, y, map) == tileDirtFloor){ 
      //map[x + xsize * y]->item = 3; 
      printf("%d at [%d, %d] \n", getCell(x, y, map), x , y); 
     } 
     // this is where the code is failing. 
     //sometimes it works, others it generates a memory error 
    } 
    free(map); 
} 

Live on Coliru

+0

Я вижу, что я сделал неправильно сейчас, очень спасибо за это. Кажется, я запутался между типами массивов. Извиняюсь за то, что не включил весь мой код - я запомню, что сделаю его компиляционным в следующий раз, когда я опубликую. Я изучаю C, используя веб-сайт «Учись С трудным путем», - думаю, мне нужно сделать еще больше, чтобы копаться в массиве и указателях, чтобы понять их в моей голове. Это прекрасно работает. Огромное спасибо. –

Смежные вопросы