[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

SDL/c++ newbie



Hej
Jeg har lavet et lille c++ program(SDL som API), der opfører sig lidt
mærkelig. Programmet starter med at tegne nogle tilfældig placeret
grønne prikker på skærmen som den derefter flytter i en tilfældig
retning. Når prikkerne rammer enden af skærmen skifter de retning.
Problemet med programmet er bare at hvis man ændre på f.eks længden som
de skal flytter sig med, melder programmet fejl:

Fatal signal: Segmentation Fault (SDL Parachute Deployed)

efter f.eks 180 "frames" (se bunden af koden)
eller hvis man sletter linjen (linje 107 dvs neder i koden):

cout << "frame " << frames << "\n";

melder den ligeledes fejl.

Jeg er ret ny inden for programmering så det er nok ikke det
smarteste program. Jeg ville blive glad hvis der er nogen der vil
fortælle mig hvad jeg har gjort galt og hvorfor det ikke virker..
jeg kompilere programmet med kommandoen: 

g++ partikelSim.cpp `sdl-config --cflags --libs` 

Jeg kører med linux fedora2
Men her er koden så(har lånt lidt fra et eksempel i en bog, der er
skrevet i c):

#include <SDL/SDL.h>
#include <iostream>
using namespace std;

#define NUM_PARTIKLER	1000
#define DT	1  //hvis man ændre for meget på denne værdi går programmet ned!?
#define V	2  //samme her!?
typedef struct partikler_s
{
	int x, y;
	double vx, vy;
} partikel_t, *partikel_p;

static partikel_t partikler[NUM_PARTIKLER];

static SDL_Surface *screen;
static SDL_Surface *partikel;

static void init_partikler()
{
	int i;
	int h = 1;

	for (i = 0; i < NUM_PARTIKLER; i++)
	{
		//giver partiklerne en retning og position
		h = -1*h;
		partikler[i].x = rand() % screen->w;
		partikler[i].y = rand() % screen->h;
		partikler[i].vx = (rand() % V)*h;
		partikler[i].vy = (sqrt(V*V+partikler[i].vx*partikler[i].vx))*h;
	}
}

static void move_partikler()
{
	int i;

	for (i = 0; i < NUM_PARTIKLER; i++)
	{
	//flytter partiklerne
		partikler[i].x += partikler[i].vx*DT;
		partikler[i].y += partikler[i].vy*DT;
	//gør at partiklerne skifter retning hvis de rammer siderne
		if(partikler[i].x < 0 || partikler[i].x > screen->w - 1)
			partikler[i].vx = -partikler[i].vx;
		if(partikler[i].y < 0 || partikler[i].y > screen->h - 1)
			partikler[i].vy = -partikler[i].vy;

	}
}

static void draw_partikler()
{
	Uint16 *raw_pixels;
	int offset, i;
	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
	if ( SDL_MUSTLOCK(screen) ) 
	{
        	if ( SDL_LockSurface(screen) < 0 ) 
		{
        		return;
        	}
    	}	

	//tror måske det er her det går galt?
	for(i = 0; i < NUM_PARTIKLER; i++)
	{
		raw_pixels = (Uint16*) screen->pixels;
		offset = (screen->pitch / 2 * partikler[i].y + partikler[i].x);
		raw_pixels[offset] = 12226; //tegner grønne pixels		
	}

	if ( SDL_MUSTLOCK(screen) ) 
		{
        		SDL_UnlockSurface(screen);
		}
	SDL_UpdateRect(screen, 0, 0, 0, 0);

}
int main()
{
	int frames;

	if (SDL_Init(SDL_INIT_VIDEO) != 0)
	{
		cout << "init video\n";
		return 1;
	}
	
	atexit(SDL_Quit);
	screen = SDL_SetVideoMode(1024, 768, 16, SDL_FULLSCREEN);

	if (screen == NULL)
	{
		cout << "screen = NULL\n";
		return 1;
	}

	init_partikler();
	for (frames = 0; frames < 800; frames++)
	{
		draw_partikler();
		move_partikler();
		cout << "frame " << frames << "\n"; //hvis man fjerner den her linje virker programmet ikke?!?
	}
	cout << "frame " << frames <<" færdig\n";
	SDL_FreeSurface(partikel);

	return 0;
}

MVH Niels


 


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:44 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *