Gamestudio Links
Zorro Links
Newest Posts
Free Live Data for Zorro with Paper Trading?
by dr_panther. 05/18/24 11:01
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (dr_panther, Ayumi), 702 guests, and 2 spiders.
Key: Admin, Global Mod, Mod
Newest Members
Hanky27, firatv, wandaluciaia, Mega_Rod, EternallyCurious
19051 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
Struct und sys_malloc #363303
03/12/11 01:01
03/12/11 01:01
Joined: Aug 2007
Posts: 1,922
Schweiz
Widi Offline OP
Serious User
Widi  Offline OP
Serious User

Joined: Aug 2007
Posts: 1,922
Schweiz
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.

Last edited by Widi; 03/12/11 01:09.
Re: Struct und sys_malloc [Re: Widi] #363309
03/12/11 01:24
03/12/11 01:24
Joined: Apr 2007
Posts: 3,751
Canada
WretchedSid Offline
Expert
WretchedSid  Offline
Expert

Joined: Apr 2007
Posts: 3,751
Canada
sizeof(PLAYER) gibt dir bereits die richtige größe aller member. Kein Grund für die noch extra Platz zu allozieren.


Shitlord by trade and passion. Graphics programmer at Laminar Research.
I write blog posts at feresignum.com
Re: Struct und sys_malloc [Re: WretchedSid] #363311
03/12/11 01:42
03/12/11 01:42
Joined: Aug 2007
Posts: 1,922
Schweiz
Widi Offline OP
Serious User
Widi  Offline OP
Serious User

Joined: Aug 2007
Posts: 1,922
Schweiz
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

Re: Struct und sys_malloc [Re: Widi] #363315
03/12/11 01:58
03/12/11 01:58
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
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?


Always learn from history, to be sure you make the same mistakes again...
Re: Struct und sys_malloc [Re: Uhrwerk] #363321
03/12/11 02:47
03/12/11 02:47
Joined: Aug 2007
Posts: 1,922
Schweiz
Widi Offline OP
Serious User
Widi  Offline OP
Serious User

Joined: Aug 2007
Posts: 1,922
Schweiz
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?

Last edited by Widi; 03/12/11 02:54.
Re: Struct und sys_malloc [Re: Widi] #363322
03/12/11 04:03
03/12/11 04:03
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
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.


Always learn from history, to be sure you make the same mistakes again...
Re: Struct und sys_malloc [Re: Uhrwerk] #363323
03/12/11 04:27
03/12/11 04:27
Joined: Aug 2007
Posts: 1,922
Schweiz
Widi Offline OP
Serious User
Widi  Offline OP
Serious User

Joined: Aug 2007
Posts: 1,922
Schweiz
Danke vielmals für die Erklährung. Wieder etwas dazugelernt.

Re: Struct und sys_malloc [Re: Widi] #363371
03/12/11 14:21
03/12/11 14:21
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
Freut mich. :-)


Always learn from history, to be sure you make the same mistakes again...
Re: Struct und sys_malloc [Re: Uhrwerk] #364039
03/16/11 03:38
03/16/11 03:38
Joined: Aug 2007
Posts: 1,922
Schweiz
Widi Offline OP
Serious User
Widi  Offline OP
Serious User

Joined: Aug 2007
Posts: 1,922
Schweiz
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.

Last edited by Widi; 03/16/11 03:52.
Re: Struct und sys_malloc [Re: Widi] #364098
03/16/11 14:54
03/16/11 14:54
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
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...


Always learn from history, to be sure you make the same mistakes again...
Page 1 of 2 1 2

Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1