[C] 9205 segmentation fault

  • Themenstarter Themenstarter Bgag
  • Beginndatum Beginndatum
B

Bgag

Hallo!

Ich habe mich heute etwas mit der Simple DirectMendia Library (libsdl) beschäftigt und habe in diesem Rahmen ein kleines programm geschrieben, mit dem ich testen wollte, ob ich die Funktionsweise verstanden habe. Nach einigen Problemen beim Kompilieren und Einbinden der libsdl gelang es mir auch schließlich das programm fertig zu kompilieren, jedoch bekomme ich beim Ausführen immer einen Segmentation fault. kann mir jemand sagen, woran das liegt? Den Quellcode habe ich euch angehängt

Vielen Dank schonmal für eure Mühen.

MfG, Andy

C:
/* include needed packages */
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include "SDL_image.h"

/* define boolean type */
enum boolean { FALSE, TRUE };

/* screen dimensions and color depth */
#define WIDTH 630
#define HEIGHT 480
#define DEPTH 32

/* define map type */
typedef struct
{
	int xfields;
	int yfields;
	int *matrix;
} map;

/* define player type */
typedef struct
{
	int xPos;
	int yPos;
} player;

/* define implemented functions */
map initMap(int x, int y);
player initPlayer(int x, int y);

int main(int argc, char* argv[])
{
	/* init helper vars */
	int x, y, quit = 0;

	/* init pointer at sdl type */
	SDL_Surface *screen,
		*background,
		*wall,
		*monster;

	/* init temporary rectangles  */
	SDL_Rect drect, srect;

	/* init rectangles fo the monster */
	SDL_Rect dmonster, smonster;

	/* init SDL_Event event */
	SDL_Event event;

	/* init step size */
	int tilesize = 30;

	/* init game map */
	map gmap = initMap(21, 16);

	/* init player */
	player oskar = initPlayer((int) 10, (int) 10);

	/* init sdl type and return 1 at failture */
	if( SDL_Init(SDL_INIT_VIDEO) < 0 )
	{
		/* print out error message */
		fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError());

		/* exit program */
		exit(1);
	}

	/* quit sdl on exit */
	atexit(SDL_Quit);

	/* get SDL_Surface pointer */
	if( (screen = SDL_SetVideoMode(630, 480, DEPTH, SDL_SWSURFACE)) == NULL )
	{
		/* output error message */
		fprintf(stderr, "Failed to create window (%d*%d): %s\n", WIDTH, HEIGHT, SDL_GetError());

		/* exit program */
		exit(-1);
	}

	/* load background image */
	if( (background = IMG_Load("background.jpg")) == NULL )
	{
		/* print out error message */
		fprintf(stderr, "Failed to load background: %s\n", SDL_GetError());

		exit(-1);
	}

	/* load wall image */
	if( (wall = IMG_Load("wall.jpg")) == NULL )
	{
		/* print out error message */
		fprintf(stderr, "Failed to load wall: %s\n", SDL_GetError());

		exit(-1);
	}

	/* load player image (the monster) */
	if( (monster = IMG_Load("monster.gif")) == NULL )
	{
		/* print out error message */
		fprintf(stderr, "Failed to load monster: %s\n", SDL_GetError());

		exit(-1);
	}

	/* set background data */
	srect.x = 0;
	srect.y = 0;
	srect.w = background->w;
	srect.h = background->h;

	drect.x = 0;
	drect.y = 0;
	drect.w = background->w;
	drect.h = background->h;

	/* set player data */
	smonster.x = 0;
	smonster.y = 0;
	smonster.w = monster->w;
	smonster.h = monster->h;
	
	dmonster.x = oskar.xPos * tilesize;
	dmonster.y = oskar.yPos * tilesize;
	dmonster.w = monster->w;
	dmonster.h = monster->h;

	/* iterate over map rows */
	for(x = 0; x < gmap.xfields; x++)
	{
		/* iterate over map columns */
		for(y = 0; y < gmap.yfields; y++)
		{
			/* set current rectangle */
			drect.x = tilesize * x;
			drect.y = tilesize * y;

			/* check if a border is needed */
			if( gmap.matrix[x * gmap.xfields + y] == 1 )
			{
				SDL_BlitSurface(background, &srect, screen, &drect);
			}

			else
			{
				SDL_BlitSurface(wall, &srect, screen, &drect);
			}
				
			SDL_UpdateRects(screen, 1, &drect);
		}
	}

	/* update monster rectangle */
	SDL_BlitSurface(monster, &smonster, screen, &dmonster);
	SDL_UpdateRects(screen, 1, &dmonster);
	
	/* free surfaces */
	SDL_FreeSurface(background);
	SDL_FreeSurface(monster);

	/* loop while in game */
	while( quit == 0 )
	{
		/* get events */
		while( SDL_PollEvent( &event ) )
		{
			switch( event.type )
			{
				case SDL_KEYDOWN:
					/* move left */
					if( event.key.keysym.sym == 276 && gmap.matrix[(oskar.xPos - 1) * gmap.xfields + oskar.yPos] != 1 )
					{
						(oskar.xPos)--;
					}

					/* move right */
					if( event.key.keysym.sym == 275 && gmap.matrix[(oskar.xPos + 1) * gmap.xfields + oskar.yPos] != 1 )
					{
						(oskar.xPos)++;
					}

					/* move down */
					if( event.key.keysym.sym == 274 && gmap.matrix[oskar.xPos * gmap.xfields + oskar.yPos + 1] != 1 )
					{
						oskar.yPos++;
					}

					/* move up */
					if( event.key.keysym.sym == 273 && gmap.matrix[oskar.xPos * gmap.xfields + oskar.yPos - 1] != 1 )
					{
						(oskar.yPos)--;
					}

					/* quit game */
					if( event.key.keysym.sym == 39 )
					{
						quit = 1;
					}

					break;
				
				case SDL_QUIT:
					quit = 1;
					break;
				
				default:
					break;
			}
		}

		/* iterate over map rows */
		for(x = 0; x < gmap.xfields; x++)
		{
			/* iterate over map columns */
			for(y = 0; y < gmap.yfields; y++)
			{
				/* set current rectangle */
				drect.x = tilesize * x;
				drect.y = tilesize * y;
	
				/* check if a border is needed */
				if( gmap.matrix[x * gmap.xfields + y] == 1 )
				{
					SDL_BlitSurface(background, &srect, screen, &drect);
				}
	
				else
				{
					SDL_BlitSurface(wall, &srect, screen, &drect);
				}
			}
		}

		SDL_BlitSurface(monster, &smonster, screen, &dmonster);
		SDL_Flip(screen);
	}

	/* quit sdl */
	SDL_Quit();

	exit(0);
}

map initMap(int x, int y)
{
	/* init helper vars */
	int i, j;

	/* init map structure */
	map gmap;

	/* set num of x und y fields */
	gmap.xfields = x;
	gmap.yfields = y;

	/* allocate space for the matrix */
	gmap.matrix = malloc( sizeof(int) * x * y);

	/* create a map end */
	for (i = 0; i < gmap.xfields; i++)
	{
		for (j = 0; j < gmap.yfields; j++)
		{
			/* check if here must be a border */
			if( (j%x == 0) || (i%y == 0) )
			{
				gmap.matrix[i * x + j] = 1;
			}

			/* no border */
			else
			{
				gmap.matrix[i * x + j] = 0;
			}
		}
	}

	return gmap;
}

player initPlayer(int x, int y)
{
	/* init player structure */
	player monster;

	/* assign start position */
	monster.xPos = x;
	monster.yPos = y;

	return monster;
}
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Was allerdings sofort auffällt: du castest zuviel. Insbesondere bei malloc. Und du hast malloc verwendet ohne die stdlib.h eingebunden zu haben.

Gruß
 
@deepthroat Stimmt die stdlib einzubinden hätte was und der von malloc() zurückggeblieferte void-Pointer sollte implizit in einen int-Pointer umgewandelt werden. Habs oben mal geändert. Danke!

@vfl_freak Es wird nicht gesagt, wo der Fehler auftritt. Hab auch ehrlich gesagt nicht die geringste Ahnung woran es liegen könnte. Dachte erst an eine falsche Reservierung des Speichers oder einen Fehlerhaften Zugriff auf diesen, aber das ist eigentlich richtig.

MfG, Andy
 
Hi,

...

@vfl_freak Es wird nicht gesagt, wo der Fehler auftritt. Hab auch ehrlich gesagt nicht die geringste Ahnung woran es liegen könnte. Dachte erst an eine falsche Reservierung des Speichers oder einen Fehlerhaften Zugriff auf diesen, aber das ist eigentlich richtig.

MfG, Andy

Dann bitte nutze einen Debugger, bspw. "gdb", valgrind usw.

Grüße ;)
 
Hi.

Deine Indexberechnung ist falsch. Du greifst auf das ((gmap.xfields-1) * gmap.xfields + (gmap.yfields-1))-te Element zu. Richtig wäre:
C:
gmap.matrix[x * gmap.yfields + y]
Gruß
 
Danke für eure schnellen Antworten.

@LSd Danke für den Tipp werde mir gdb mal ansehen.

@deepthroat Ohh da muss ein Dreher in der Benennung der Variablen sein. Du hast also Recht. Danke für den Hinweis. Werde also nochmal die Bennenung der Variablen ändern, damit man da auch später noch durchsteigt.

MfG, Andy
 
Zurück