Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Segmentation Faults with 2D-array (http://www.go4expert.com/forums/segmentation-faults-2d-array-t21636/)

Damon Dike 3Apr2010 03:12

Segmentation Faults with 2D-array
 
I am trying to write a program to solve simple mazes but somehow I can't get it to put the maze in a 2D-array, this is my code:

Code:

int **doolhof;

void allocateMemory(int *column, int *row){
        int i;
        doolhof = malloc((*column)*sizeof(int));
        for(i = 0; i < *column; i++){
                doolhof[i] = malloc((*row)*sizeof(int));
                if(debug) printf("alloceerGeheugen - i = %d\n", i);
                if (doolhof[i] == NULL) {
                        printf("Not enough memory\n");
                        exit(-1);
                }
        }
}

void getMaze(int *maxStap, int *column, int *row){
        int i, j;
        char temp;
        scanf("%d %d", row, column);
        *maxStap = (*row) * (*column) + 1;
        allocateMemory(column, row);
        for (i = 0; i < *row; i++){
                for (j = 0; j < *column; j++){
                        scanf("%c", &temp);
                        switch (temp) {
                                case '.':
                                        if(j == (*column) - 1 || j == 0 || i == (*row) - 1 || i == 0) doolhof[i][j] = -4;
                                        else doolhof[i][j] = *maxStap;
                                        break;
                                case '#':
                                        doolhof[i][j] = -1;
                                        break;
                                case '^':
                                        doolhof[i][j] = -2;
                                        break;
                                case '%':
                                        doolhof[i][j] = -3;
                                        break;
                                default:
                                        j--;
                                        break;
                        }
                }
        }
        /* Filling the center of the maze with zero */
        doolhof[*row/2][*column/2] = 0;
}

void readIn(int *types, int *column, int *row, int *maxStep){
        int gate, flower, personen, i, lengte;
        scanf("%d %d", &gate, &flower);
        scanf("%d", &personen);
        for(i = 0; i < personen; i++){
                scanf("%d", &lengte);
                if(lengte > flower) {
                        if(lengte < gate) {
                                types[0] = 1;
                        } else {
                                types[2] = 1;
                        }
                } else {
                        if( lengte < gate) {
                                types[1] = 1;
                        } else {
                                types[3] = 1;
                        }
                }
        }
        getMaze(maxStep, column, row);
}

int main(int argc, char *argv[]){
        int n, i, result;
        int column = 0, row = 0, maxStep = 0;
        int types[3];
        scanf("%d", &n);
        resetTypes(types);
        for (i = 0 ; i < n; i++){
                readIn(types, &column, &rij, &maxStep);       
        }
        return 0;
}

n is the number of mazes to be solved.
readIn is supposed to read in all information relevant to solving the maze such as the maximum hight to be able to step through a gate represented by ^ and -2, the minimum size to be able to step over a flowerbed represented by % and -3. Personen is the size of the team, lengte containts the size of each team member. The four types of team members are:
0 these can step over flowerbeds and walk through gates.
1 these can walk through gates.
2 these can step over flowerbeds.
3 these can not step over flowerbeds nor can they walk through gates, they can only walk on the grass, represented by '.'

Get maze actually fills the 2D array with numbers representing the obstacles in the mazes. Places where everybody can walk are represented by column*row+1, this to facilitate the use of Dijkstra's algorithm later on.

Whenever I try to run this program I get a segmentation fault while reading in the last lines of the mazes. I can't imagine what goes wrong especially as reading in the first few lines doesn't seem to be a problem.

I hope anyone can help me.

Damon Dike 3Apr2010 03:17

Re: Segmentation Faults with 2D-array
 
If anyone could tell how I can switch HTML code from off to on I would be grateful, cause this doesn't look very inviting.

Damon Dike 3Apr2010 03:30

Re: Segmentation Faults with 2D-array
 
Quote:

Originally Posted by Damon Dike (Post 66612)
If anyone could tell how I can switch HTML code from off to on I would be grateful, cause this doesn't look very inviting.

Nevermind this one I should have used capital letters and a forward slash instead of a backward. I hope one of the admins can change it as I can't edit my own posts or can't find the right button to do that.

shabbir 3Apr2010 09:59

Re: Segmentation Faults with 2D-array
 
Quote:

Originally Posted by Damon Dike (Post 66613)
Nevermind this one I should have used capital letters and a forward slash instead of a backward. I hope one of the admins can change it as I can't edit my own posts or can't find the right button to do that.

Done that and edit option will be available after you have double digit post count.

Damon Dike 3Apr2010 16:18

Re: Segmentation Faults with 2D-array
 
Solved, the code seems to work for now, here it is:

Code:

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

int **doolhof;

void printMaze(int *column, int *row){
        int i, j;
        for (i = 0; i < *row; i++){
                for (j = 0; j < *column; j++){
                        printf("%d ", doolhof[i][j]);
                }
                printf("\n");
        }
        printf("\n");
}

void allocateMemory(int *column, int *row){
        int i;
        doolhof = calloc( *column, sizeof(int*));
        for(i = 0; i < *column; i++){
                doolhof[i] = calloc(*column, sizeof(int));
                if (doolhof[i] == NULL) {
                        printf("Not enough memory\n");
                        exit(-1);
                }
        }
}

void getMaze(int *maxStap, int *column, int *row){
        int i, j;
        char temp;
        scanf("%d %d", row, column);
        *maxStap = (*row) * (*column) + 1;
        allocateMemory(column, row);
        scanf("%c", &temp);
        for (i = 0; i < *row; i++){
                for (j = 0; j < *column; j++){
                        scanf("%c", &temp);
                        if(debug) printf("i = %d, j=%d, temp = %c\n", i, j, temp);
                        switch (temp) {
                                case '.':
                                        if(j == (*column) - 1 || j == 0 || i == (*row) - 1 || i == 0) doolhof[i][j] = -4;
                                        else doolhof[i][j] = *maxStap;
                                        break;
                                case '#':
                                        doolhof[i][j] = -1;
                                        break;
                                case '^':
                                        doolhof[i][j] = -2;
                                        break;
                                case '%':
                                        doolhof[i][j] = -3;
                                        break;
                                default:
                                        j--;
                                        break;
                                        printMaze(column, row);
                        }
                }
        }
        /* Midden van het doolhof op nul zetten */
        doolhof[*row/2][*column/2] = 0;
}

void readIn(int *types, int *column, int *row, int *maxStep){
        int gate, flower, personen, i, lengte;
        scanf("%d %d", &gate, &flower);
        scanf("%d", &personen);
        for(i = 0; i < personen; i++){
                scanf("%d", &lengte);
                if(lengte > flower) {
                        if(lengte < gate) {
                                types[0] = 1;
                        } else {
                                types[2] = 1;
                        }
                } else {
                        if( lengte < gate) {
                                types[1] = 1;
                        } else {
                                types[3] = 1;
                        }
                }
        }
        getMaze(maxStep, column, row);
}

int main(int argc, char *argv[]){
        int n, i, result;
        int column = 0, row = 0, maxStep = 0;
        int types[4];
        q = malloc(sizeof(struct queue));
        q->first = NULL;
        q->last = NULL;
        scanf("%d", &n);
        resetTypes(types);
        for (i = 0 ; i < n; i++){
                readIn(types, &column, &row, &maxStep);
        }
        return 0;
}



All times are GMT +5.5. The time now is 09:36.