Verktyg Visningsval
2012-04-26, 22:28   #1

stoffe1100

Medlem

Registrerad: sep 2011

c++ SDL runtime errors


Hej jag får skumma runtime errors med mitt första försök till Pong i SDL. Har googlat runt lite på anledningar men hittar inte mycket. Så det får bli ytterligare en tråd.

Just nu är alla Runtime errors borta men "Paddlarna" visas inte på skärmen. Tänkte fråga om någon vet något.

Vet att jag programmerat på Svengelska men ni får leva med det hehe....

Här är main.cpp

#include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_Image.h>
#include "paddle.h"
#define FPS 30

using namespace std;

SDL_Surface * screen;
SDL_Event event;
Uint32 start;

bool keys[256];
bool fullscreen = false;
bool running = true;

bool init();

int main(int argc,char** argv)
{
	if((!init())){SDL_Quit(); return 0;}
	paddle paddle1(1);
	paddle paddle2(2);

	while(running)
	{
		start = SDL_GetTicks();
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
			case SDL_QUIT:
				running = false;
				break;
			case SDL_KEYUP:
				keys[event.key.keysym.sym] = false;
				break;
			case SDL_KEYDOWN:
				if(event.key.keysym.sym == SDLK_f){fullscreen = (!fullscreen);}
				if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;}
				keys[event.key.keysym.sym] = true;
				break;
			}
		}
		if(keys[SDLK_w]){cout << "W IS DOWN" << endl; paddle1.Up();}
		else if(keys[SDLK_s]){cout << "S IS DOWN" << endl; paddle1.Down();}
		if(keys[SDLK_UP]){cout << "ARROWUP IS DOWN" << endl;paddle2.Up();}
		else if(keys[SDLK_DOWN]){cout << "ARROWDOWN IS DOWN" << endl; paddle2.Down();}

		if(fullscreen){screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);}else{screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);}

		SDL_FillRect(screen,NULL,NULL);

		paddle1.Blit();
		paddle2.Blit();

		SDL_Flip(screen);
		if(1000/FPS > SDL_GetTicks() - start){SDL_Delay(1000/FPS - (SDL_GetTicks() - start));}
	}
	SDL_Quit();

	return 0;
}

bool init(){

	if(SDL_Init(SDL_INIT_EVERYTHING) == -1){
		std::cout << "Could not initialize sdl" << std::endl;
		return false;
	}
	std::cout << "SDL initilized" << std::endl;

	screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

	if(screen == NULL){
		std::cout << "Could not setup screen" << std::endl;
		return false;
	}

	std::cout << "Screen is setup" << std::endl;


	if(TTF_Init() == -1){
		std::cout << "Could not initialize ttf" << std::endl;
		return false;
	}

	std::cout << "TTF initilized" << std::endl;

	SDL_WM_SetCaption("Pong",NULL);

	return true;

}
Här är paddle.h

#pragma once
#include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_Image.h>

#include "global_functions.h"


class paddle
{
public:
	paddle(short nr);
	~paddle(void);

	void Up();
	void Down();
	void Blit();

	
private:
	int YVel;
	SDL_Surface * image;
	SDL_Rect box;
};
Här är paddle.cpp

#include "paddle.h"


paddle::paddle(short nr)
{
	global_functions f;
	image = f.Load_Image("paddle.jpg");
	image->refcount++;
	YVel = 5;
	box.w = image->w;
	box.h = image->h;
	box.y = SDL_GetVideoSurface()->h/2 - box.h/2;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = SDL_GetVideoSurface()->w - box.w;
		break;
	}

}

void paddle::Up()
{
	box.y-=YVel;
}

void paddle::Down()
{
	box.y+=YVel;
}

void paddle::Blit()
{
	SDL_BlitSurface(image,NULL,SDL_GetVideoSurface(),&box);
}

paddle::~paddle(void)
{
	SDL_FreeSurface(image);
}

Senast redigerad av stoffe1100 2012-05-04 klockan 18:20.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-04-27, 01:55   #2

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Hm skulle satsa på att felet ligger vid

PaddelIMG = functions.Load_Image("paddle.jpg");
körde det med vanlig SDL funktionen för att ladda bilder.
och då vissa den min bild iallafall.

PaddelIMG = IMG_Load("bar2.bmp");
sen bör du VERKLIGEN kolla igenom att dina Switchcase satser är korrekta för nu ser dom väldigt konstiga ut.
__________________
orka
miffo är uppkopplad nu
2012-04-27, 16:39   #3

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
Hm skulle satsa på att felet ligger vid

PaddelIMG = functions.Load_Image("paddle.jpg");
körde det med vanlig SDL funktionen för att ladda bilder.
och då vissa den min bild iallafall.

PaddelIMG = IMG_Load("bar2.bmp");
sen bör du VERKLIGEN kolla igenom att dina Switchcase satser är korrekta för nu ser dom väldigt konstiga ut.
Oj, glömde skicka med Load_Image, det är en funktion jag skrev själv, Den ser ut såhär

SDL_Surface * global_functions::Load_Image(std::string filename){

	image = IMG_Load(filename.c_str());

	if(image != NULL){
	Optimized_Image = SDL_DisplayFormat(image);
	}
	else{
		std::cout << "Image could not be loaded" << std::endl;
	}
	return Optimized_Image;
}
Jag får inte upp Image could not be loaded på consolen så det kan inte vara det
kan tillägga att jag kopierade denna från ett annat projekt och där funkade allt utmärkt!

Senast redigerad av stoffe1100 2012-04-27 klockan 16:48.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-04-27, 19:02   #4

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Citat:
Ursprungligen inskrivet av stoffe1100 Visa inlägg
Oj, glömde skicka med Load_Image, det är en funktion jag skrev själv, Den ser ut såhär

SDL_Surface * global_functions::Load_Image(std::string filename){

	image = IMG_Load(filename.c_str());

	if(image != NULL){
	Optimized_Image = SDL_DisplayFormat(image);
	}
	else{
		std::cout << "Image could not be loaded" << std::endl;
	}
	return Optimized_Image;
}
Jag får inte upp Image could not be loaded på consolen så det kan inte vara det
kan tillägga att jag kopierade denna från ett annat projekt och där funkade allt utmärkt!
Okej, för jag copy&paste koden och körde det, och fick bilden att vissas.
Och jag ser inget fel på den där koden.

Testa att köra med en absolut sökväg till filen se om det funkar bättre då.
vet att jag haft problem med relative sökvägar när jag startar program i VS.
__________________
orka
miffo är uppkopplad nu
2012-04-27, 23:05   #5

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
Okej, för jag copy&paste koden och körde det, och fick bilden att vissas.
Och jag ser inget fel på den där koden.

Testa att köra med en absolut sökväg till filen se om det funkar bättre då.
vet att jag haft problem med relative sökvägar när jag startar program i VS.
Bara så att jag fattar rätt, Med absolut sökväg menar du ungefär Dokument/visual studio2010/projekts/pong
?
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-04-28, 00:58   #6

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Citat:
Ursprungligen inskrivet av stoffe1100 Visa inlägg
Bara så att jag fattar rätt, Med absolut sökväg menar du ungefär Dokument/visual studio2010/projekts/pong
?
"c:\\etz\\pong\\alal.jpg"
__________________
orka
miffo är uppkopplad nu
2012-04-30, 20:13   #7

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
"c:\\etz\\pong\\alal.jpg"
Hej ledsen för mitt sena svar men blev sur efter extremt lång tid framför datorn utan framgång men idag har jag skrivit om hela koden och det visas fortfarande ingen bild. Uppdaterar första inlägget med den helt omskrivna koden (Troligtvis ser den för det mesta likadan ut)

Den här gången har jag 2 skumma problem, För det första fryser programmet helt när jag startar det, för det andra så får jag runtime errors direkt om jag använder FreeSurface(IMG) i funktionen LoadBMP

EDIT: Nu försvann problemet med FreeSurface(IMG), SDL förvirrar mig, (Troligtvis jag som klantar mig)

Senast redigerad av stoffe1100 2012-04-30 klockan 20:22.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-04-30, 21:15   #8

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Citat:
Ursprungligen inskrivet av stoffe1100 Visa inlägg
Hej ledsen för mitt sena svar men blev sur efter extremt lång tid framför datorn utan framgång men idag har jag skrivit om hela koden och det visas fortfarande ingen bild. Uppdaterar första inlägget med den helt omskrivna koden (Troligtvis ser den för det mesta likadan ut)

Den här gången har jag 2 skumma problem, För det första fryser programmet helt när jag startar det, för det andra så får jag runtime errors direkt om jag använder FreeSurface(IMG) i funktionen LoadBMP

EDIT: Nu försvann problemet med FreeSurface(IMG), SDL förvirrar mig, (Troligtvis jag som klantar mig)
du använder dig av freesurface men räknar du någonsin upp refcount ?

SDL_Surface pekare1, pekare2;

pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
SDL_FreeSurface(pekare1);
I ovanstånde kommer pekare 2 aldrig att fungera eftersom jag inte räkna upp refcount mellan freesurface. Så freesurface kommer tar bort surfacen,
och pekare2 kommer peka på skräp.

SDL_Surface pekare1, pekare2;

pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
pekare2->refcount++;
SDL_FreeSurface(pekare1);
I det här exemplet räknar jag upp refcount. så när freesurface blir anropad kollar den hur många som refererar till objektet, det är 2 st nu. då drar en bort en och tar inte bort surfacen. nu fungerar pekare2 men inte pekare1.

kan inte svära att det är ditt problem bara men läs

paddle::paddle(SDL_Surface * IMG, int nr)
{
	vel = 5;
	image = IMG;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = 800 - image->w;
		break;
	}
	box.y = 600/2 - box.h/2;
	box.w = image->w;
	box.h = image->h;
	SDL_FreeSurface(IMG);
}
__________________
orka
miffo är uppkopplad nu
2012-04-30, 21:48   #9

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
du använder dig av freesurface men räknar du någonsin upp refcount ?

SDL_Surface pekare1, pekare2;

pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
SDL_FreeSurface(pekare1);
I ovanstånde kommer pekare 2 aldrig att fungera eftersom jag inte räkna upp refcount mellan freesurface. Så freesurface kommer tar bort surfacen,
och pekare2 kommer peka på skräp.

SDL_Surface pekare1, pekare2;

pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
pekare2->refcount++;
SDL_FreeSurface(pekare1);
I det här exemplet räknar jag upp refcount. så när freesurface blir anropad kollar den hur många som refererar till objektet, det är 2 st nu. då drar en bort en och tar inte bort surfacen. nu fungerar pekare2 men inte pekare1.

kan inte svära att det är ditt problem bara men läs

paddle::paddle(SDL_Surface * IMG, int nr)
{
	vel = 5;
	image = IMG;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = 800 - image->w;
		break;
	}
	box.y = 600/2 - box.h/2;
	box.w = image->w;
	box.h = image->h;
	SDL_FreeSurface(IMG);
}
Jag känner mig äckligt tjatig, Jag har lärt mig c++ helt på egen hand och har därför missat mycket av det grundläggande antar jag... Letar ständigt efter tutorials och försöker repetera men man missar alltid något. Jag sökte runt lite på refcount, Hittar mest bara trådar om folk som har problem med refcount och inte om vad det är. Om du har tid och lust orkar du förklara för mig vad det är?

EDIT: Antar att jag bör bara läsa på mer om pekare och hur SDL_Surface sparas kanske?

Senast redigerad av stoffe1100 2012-04-30 klockan 22:52.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-05-01, 01:08   #10

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Inget fel att lära sig på egenhand.
Anledningen SDL ser ur som det gör är för att det i huvudask är C och inte C++ så dom använder structar istället för klasser.
Refcount används för att ser hur många som pekar på structen, så att den inte städar bort structen medans annat pekar på den.
Dock så är det upp till programmeraren att lägga till på refcount, Detta sker inte automatisk.

om du vill läsa på om SDL finns det en API beskrivning på http://www.libsdl.org/cgi/docwiki.cgi/SDL_API
och för bara hur c++ fungerar är väll http://www.cplusplus.com/doc/tutorial/ en bra läsning.
__________________
orka
miffo är uppkopplad nu
2012-05-01, 11:08   #11

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
Inget fel att lära sig på egenhand.
Anledningen SDL ser ur som det gör är för att det i huvudask är C och inte C++ så dom använder structar istället för klasser.
Refcount används för att ser hur många som pekar på structen, så att den inte städar bort structen medans annat pekar på den.
Dock så är det upp till programmeraren att lägga till på refcount, Detta sker inte automatisk.

om du vill läsa på om SDL finns det en API beskrivning på http://www.libsdl.org/cgi/docwiki.cgi/SDL_API
och för bara hur c++ fungerar är väll http://www.cplusplus.com/doc/tutorial/ en bra läsning.
Du nämnde något om att Refcount även gör så att föregående pekare som pekat på strukturen pekar på skräp efter refcount på en annan? Kan man inte få två olika att peka på samma eller, Jag är lite förvirrad ännu.

Vänta nu, Tror jag fattade det, Du har räddat ytterligare en av mina trådar. Du är min hjälte

Bara en tillägsfråga för att kolla så att jag förstår allt. Om jag hade skrivit pekare1->refcount++ så hade väl det gjort exakt samma sak som
pekare2->refcount++ eftersom de pekar på samma struktur

För övrigt så låg och läste halva natten igår på mobilen på cplusplus.com om pekare ,hehe. Men måste missat den sidan om SDL api. Ska nog ta en paus med att programmera och börja läsa i några dagar. Ser bra ut, Tack så mycket

Senast redigerad av stoffe1100 2012-05-01 klockan 11:22.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-05-01, 18:15   #12

miffo

Medlem

miffos avatar

Plats: Stockholm

Registrerad: aug 2002

Citat:
Ursprungligen inskrivet av stoffe1100 Visa inlägg
Du nämnde något om att Refcount även gör så att föregående pekare som pekat på strukturen pekar på skräp efter refcount på en annan? Kan man inte få två olika att peka på samma eller, Jag är lite förvirrad ännu.

Vänta nu, Tror jag fattade det, Du har räddat ytterligare en av mina trådar. Du är min hjälte

Bara en tillägsfråga för att kolla så att jag förstår allt. Om jag hade skrivit pekare1->refcount++ så hade väl det gjort exakt samma sak som
pekare2->refcount++ eftersom de pekar på samma struktur

För övrigt så låg och läste halva natten igår på mobilen på cplusplus.com om pekare ,hehe. Men måste missat den sidan om SDL api. Ska nog ta en paus med att programmera och börja läsa i några dagar. Ser bra ut, Tack så mycket
Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr)
{
	vel = 5;
	image = IMG;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = 800 - image->w;
		break;
	}
	box.y = 600/2 - box.h/2;
	box.w = image->w;
	box.h = image->h;
	SDL_FreeSurface(IMG);
}
I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.
__________________
orka
miffo är uppkopplad nu
2012-05-01, 18:43   #13

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr)
{
	vel = 5;
	image = IMG;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = 800 - image->w;
		break;
	}
	box.y = 600/2 - box.h/2;
	box.w = image->w;
	box.h = image->h;
	SDL_FreeSurface(IMG);
}
I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.
Hmm, Tror jag är med nu.

Skulle man inte kunna sätta som en regel för sig själv när man programmerar i SDL att om man har följande rad:
SDL_Surface * srf1 = SDL_Surface * srf2 (du fattar)

Så ska den även ha en motsvarande srf1->refcount++?
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
2012-05-04, 18:18   #14

stoffe1100

Medlem

Registrerad: sep 2011

Citat:
Ursprungligen inskrivet av miffo Visa inlägg
Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr)
{
	vel = 5;
	image = IMG;
	switch(nr)
	{
	case 1:
		box.x = 0;
		break;
	case 2:
		box.x = 800 - image->w;
		break;
	}
	box.y = 600/2 - box.h/2;
	box.w = image->w;
	box.h = image->h;
	SDL_FreeSurface(IMG);
}
I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.
Tjenare, Nu har jag gjort om mitt pong grundligt och allting går mycket finare nu Nu är problemet att det funkar inte att hålla ner knappar. förstår inte varför. Blir ett knapptryck och sen ingenting mer. Har ju faktiskt gjort en bool array för att kolla det, Uppdaterar koden i första inlägget nu så kanske du kan kolla lite på det.

EDIT: Märkte även att när jag startar fullscreen börjar allt flimmra. Hur kan detta ske?

Senast redigerad av stoffe1100 2012-05-04 klockan 19:30.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |
stoffe1100 är inte uppkopplad
Senaste nyheterna

Redaktionens senaste nyhetsrubriker