2 registered members (dr_panther, Ayumi),
702
guests, and 2
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Struct und sys_malloc
#363303
03/12/11 01:01
03/12/11 01:01
|
Joined: Aug 2007
Posts: 1,922 Schweiz
Widi
OP
Serious User
|
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.
#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
Expert
|
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
OP
Serious User
|
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
|
|
|
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
Expert
|
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] 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
OP
Serious User
|
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
Expert
|
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]
#364039
03/16/11 03:38
03/16/11 03:38
|
Joined: Aug 2007
Posts: 1,922 Schweiz
Widi
OP
Serious User
|
OP
Serious User
Joined: Aug 2007
Posts: 1,922
Schweiz
|
So, nach 10000 Haaren weniger (habe sonst schon nicht mehr viele ) konnte ich den Fehler lokalisieren. Es liegt jedenfalls zu 100% deim Speicherzuweisen. Falls ich jetzt etwas falsches erzähle, bitte korrigiert mich:
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:
typedef struct
{
...
BOMBE* Bombe[Anz_bomben];
} PLAYER;
Für den Pointer auf den Struct BOMBE im Struct PLAYER muss ich nun Speicher zuweisen:
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 ). 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
Expert
|
Expert
Joined: Jan 2002
Posts: 4,225
Germany / Essen
|
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! 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...
|
|
|
|