Struct und sys_malloc

Posted By: Widi

Struct und sys_malloc - 03/12/11 01:01

Hallo ihr Struct - Heroes,
Habe ein Problem in meinem 2D Bomberman. Das Game stürzt immer wieder ab, weil ein normaler Pointer eines Levelstückes ungültig wird (glaube ich nach einigen Testzumindest).
Jedes Tilestück (Panel) im Level hat einen Pointer und irgendwann zufällig wenn ich pan_setbmap oder alpha ändern will ist einer dieser Pointer ungültig.

Was ich mir vorstellen kann, ist dass ich mit sys_malloc etwas falsch mache. Habe 2 Array-Structs in meinem Spiel, einen für Bomben (10 Stück pro Player) und einen für 8 Spieler, in dem auch der Bombenstruct enthalten ist. Hier eine verkürzte version der Structs, mein Spiel enthaltet mehr vars und BOOL`s.
Code:
#define Anz_spieler    8
#define Anz_bomben     10 // (pro Player)

typedef struct
{
	var    koor_x_abs;
	var    koor_y_abs;
	...
	var    countdown;
	PANEL* panel;
} BOMBE;

/////////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct
{
	var    koor_x_abs;
	var    koor_y_abs;
	...
	BOOL   t1_gedr;
	BOOL   t2_gedr;
	
	PANEL* panel;
	
	BOMBE  Bombe[Anz_bomben]; //  <-- ist das so richtig? 
} PLAYER;

PLAYER  Player[Anz_spieler];

//*************************************************************************************************//

void INIT_STRUCT()
{
	PLAYER *Player = sys_malloc ((sizeof(PLAYER) + (sizeof(BOMBE)  * Anz_bomben)) * Anz_spieler);}


Ist die function INIT_STRUCT so richtig?
Bin ich auch richtig mit der Annahme dass sys_malloc Speicherbereich zur verfügung stellt für die var`s, BOOL`s und Panelpointer? Der Panel wird im Spiel mit pan_create erzeugt, für das Panel selber muss ich ja keinen Speicherbereich bereitstellen?

Möchte nur wissen, ob das hier so richtig ist, damit ich das als Ursache für mein Problem ausschliessen kann. Danke.
Posted By: WretchedSid

Re: Struct und sys_malloc - 03/12/11 01:24

sizeof(PLAYER) gibt dir bereits die richtige größe aller member. Kein Grund für die noch extra Platz zu allozieren.
Posted By: Widi

Re: Struct und sys_malloc - 03/12/11 01:42

Dann reicht also schon:

PLAYER *Player = sys_malloc (sizeof(PLAYER));

Danke für die Antwort, jetzt kann ich den Bug weitersuchen, mache das ja sooooo gerne (etwas für den "Es kotzt mich verdammt an" Thread wink
Posted By: Uhrwerk

Re: Struct und sys_malloc - 03/12/11 01:58

Widi, ich habe etwas Zweifel, dass dieser Code tut was Du möchtest.

Du erstellst über der letzten Kommentarlinie ein statisches Array (PLAYER Player[Anz_spieler]wink mit den Spielerinformationen.

In INIT_STRUCT allokierst Du Speicher für ein gleichartiges Array und weist das Ergebnis einer lokalen Variablen zu. Beim Verlassen von INIT_STRUCT ist dieser Speicher verloren, da Dir die Adresse verloren geht.

Oder kommt da noch was anderes an Code, das Du nicht gepostet hast?
Posted By: Widi

Re: Struct und sys_malloc - 03/12/11 02:47

Nein, das ist im Grunde aller Code. Darum frage ich ja hier.
So wie ich das verstehe, kreiere ich ein Player Array mit der Anz_spieler (=8) also sollte der Struct für jeden Player ein mal zur Verfügung stehen. Den Speicher muss ich doch wie in der INIT_STRUCT allokieren? Oder nicht? Bin leider mit Structs nicht so vertraut, hatte noch nicht viel damit zu tun. Ist auch möglich, dass ich hier einen vollkommenen Quatsch annehme. Bin froh um jede Richtigstellung und Erklährung.

Der Code funktioniert übrigens einwandfrei, es geht mir nur um die Structs und Speicher allokieren.

Danke für weitere Erklährungen...

EDIT: Bin jetzt ein bissche verunsichert: Erstelle ich mit PLAYER Player[Anz_spieler]; eventuell schon den Structarrayund muss ihm desswegen gar keinen Speicher mehr zuweisen? Es gibt ja auch Structpointer und denen MUSS man Speicher zuweisen?
Posted By: Uhrwerk

Re: Struct und sys_malloc - 03/12/11 04:03

Ja, das ist richtig. Mit der Array Deklaration wird auch gleich der Speicher bereitgestellt. Das Array "Player" ist ja statisch, da die Größe bereits zur Compilezeit bekannt ist. Die Funktion INIT_STRUCT tut nichts ausser Speicher zu allokieren und die Adresse des Speichers der lokalen Variablen Player zuzuweisen. Die globale Variable wird davon nicht verändert, denn die lokale Variable überdeckt sie. Nach dem Verlassen der Funktion ist der allokierte Speicher verloren. Im Prinzip ist INIT_STRUCT also eine Funktion, die ausschliesßlich ein Memory Leak "implementiert", um es mal positiv auszudrücken. Der Rest Deines Codes wird davon ja nicht betroffen.

malloc /sys_malloc / sys_nxalloc sind nur dann sinnvoll, wenn Du Dinge dynamische allokieren willst, weil Du zur Compilezeit noch nicht weisst, wieviel Speicher Du benötigen wirst. Ggf. ist der Einsatz von malloc und Konsorten noch sinnvoll um sicher zu stellen, das Variablen auf dem Heap und nicht im Stack allokiert werden. Das spielt für Deinen Fall hier aber keine Rolle.
Posted By: Widi

Re: Struct und sys_malloc - 03/12/11 04:27

Danke vielmals für die Erklährung. Wieder etwas dazugelernt.
Posted By: Uhrwerk

Re: Struct und sys_malloc - 03/12/11 14:21

Freut mich. :-)
Posted By: Widi

Re: Struct und sys_malloc - 03/16/11 03:38

So, nach 10000 Haaren weniger (habe sonst schon nicht mehr viele wink ) konnte ich den Fehler lokalisieren. Es liegt jedenfalls zu 100% deim Speicherzuweisen. Falls ich jetzt etwas falsches erzähle, bitte korrigiert mich:
Code:
typedef struct
{
   ...
   BOMBE  Bombe[Anz_bomben];
} PLAYER;


Diese Zeile habe ich in dem Struct PLAYER, aber so wie es aussieht darf ich in einem Struct nur einen POINTER auf einen anderen Struct einfügen und nicht den Struct selber, sonst wird der Speicher dafür nicht zur Verfügung gestellt:
Code:
typedef struct
{
   ...
   BOMBE* Bombe[Anz_bomben];
} PLAYER;


Für den Pointer auf den Struct BOMBE im Struct PLAYER muss ich nun Speicher zuweisen:
Code:
void INIT_STRUCT()
{
	for (i=0;i<Anz_spieler; i++)
	{
		for (j=0;j<Anz_bomben; j++)
		{
			Player[i].Bombe[j] = malloc(sizeof(BOMBE));
		}
	}
}


Wobei ich nach unendlich vielen Versuchen merkte, dass es mit malloc funktioniert, mit sys_malloc aber nicht!?

Warum das, sind diese beiden Befehle unterschiedlich oder könnte das ein Bug sein (oder mache ich wieder was falsch, ist ja gut möglich wink ). Sobald ich "malloc" mit "sys_malloc" ersetze, habe ich wieder Pointer und vars im Spiel die verrückt spielen.
Posted By: Uhrwerk

Re: Struct und sys_malloc - 03/16/11 14:54

Originally Posted By: Widi
Wobei ich nach unendlich vielen Versuchen merkte, dass es mit malloc funktioniert, mit sys_malloc aber nicht!?

Das ist ein sicheres Zeichen dafür, dass Du Sch..... gebaut hast. Kann ich aus eigener Erfahrung behaupten. ;-) Denk dran, wenn Du sys_malloc benutzt, dann auch sys_free benuzen! Und mit malloc natürlich nur free!

Originally Posted By: Widi
Diese Zeile habe ich in dem Struct PLAYER, aber so wie es aussieht darf ich in einem Struct nur einen POINTER auf einen anderen Struct einfügen und nicht den Struct selber, sonst wird der Speicher dafür nicht zur Verfügung gestellt:
Ich wüsste nicht, warum man in einem Struct nicht auch einen Struct enthalten sein dürfte.

Da war ich mir geradenur fast ganz sicher und hab es deswegen nochmal ausprobiert. Structs kannst Du schachteln und auch Arrays von anderen Structs reinpacken. Wenn Du magst, probier es einfach aus und befrage anschliessend das sizeof Orakel. ;-)

Natürlich kannst Du auch ein Array von Pointern nehmen, wie Du es hier gemacht hast. Was sind denn i und j in INIT_STRUCT?

EDIT: Tüte Deutsch gekauft...
Posted By: Widi

Re: Struct und sys_malloc - 03/16/11 15:20

Quote:

Denk dran, wenn Du sys_malloc benutzt, dann auch sys_free benuzen! Und mit malloc natürlich nur free!

Das habe ich, ist mir auch klar.
Quote:

Was sind denn i und j in INIT_STRUCT?

Das sind einfach Variablen die von 0 bis Anz_player-1 respektive 0 bis Anz_bombe-1 hochzählen. Habe 8 Player (= Anz_spieler) und jeder Player hat 10 Bomben(= Anz_bomben), somit muss ich ja schlussendlich für 80 Bomben Speicher reservieren. Das mache ich mit den 2 verschachtelten for(i/j) Anweisungen.
Quote:

Das ist ein sicheres Zeichen dafür, dass Du Sch..... gebaut hast.

grin grin grin Aber ich wüsste nicht wo. Das sind meine einzigen zwei Structs die ich habe und zugriffe auf das Playerarray ist immer 0 bis 7 und das Bombenarray immer 0 bis 9, das habe ich schon hunderte Male geprüft. Frage: habe auch BOOL in den Structs, kann das sein dass das mit sys_malloc nicht funktioniert?
Quote:

Da war ich mir geradenur fast ganz sicher und hab es deswegen nochmal ausprobiert. Structs kannst Du schachteln und auch Arrays von anderen Structs reinpacken. Wenn Du magst, probier es einfach aus und befrage anschliessend das sizeof Orakel. ;-)

Das hat bei mir nicht funktioniert, wenn ich es so mache wie im ersten Beispiel von meinem letzten Post, spielen die anderen existierenden Pointer und vars nach einer Weile verrückt. Am Anfang ist alles io, aber sobald ich einige Bomben gelegt habe --> Absturz... Die Probleme traten auch erst auf, als die Structs relativ gross wurden. Werde aber deinen Ratschlag zu Herzen nehmen und nochmals ein paar Versuche mit "deinem" sizeof probieren. Das habe ich bis jetzt noch nicht versucht. Muss mit den Versuchen allerdings noch ein bisschen warten, fliege heute von Brasilien zurück in die Schweiz. cry

Nochmals: Danke für deine Unterstützung, weiss das zu schätzen.
© 2024 lite-C Forums