|
Verfasser |
Nachricht |
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
malloc() freezed PSP
Heyho,
Ich programmiere momentan an einem kleinen Homebrew.
Ich habe mir eine Sprites Engine programmiert, die Sprites, etc. Für mich verwaltet, zeichnet, etc.
Allerdings habe ich ein Problem. In einer Funktion (Zum Laden von Grafiken) gibt es momentan Probleme.
Wenn ich die Datei "gfx/raumschiff.png" lade mit höhexbreite = 64x64 geht alles ohne Probleme.
Wenn ich jetzt aber die Datei "gfx/Hintergrund.png" lade mit höhexbreite = 480x272 stürzt das Programm bei dem malloc() für die Variable Images ab.
Hier die Funktion:
int loadSpriteImage(char* filename, int width, int height)
{
// New Code:
backUpImages = malloc(sizeof(struct SpriteImage) * imagesLoaded);
int i;
for(i = 0; i < imagesLoaded; i++)
{
backUpImages[i] = Images[i];
}
Images = malloc(sizeof(struct SpriteImage) * (imagesLoaded + 1)); // Hier hängt es
Images[imagesLoaded].size.x = width;
Images[imagesLoaded].size.y = height;
Images[imagesLoaded].theImage = loadImage(filename);
for(i = 0; i < imagesLoaded; i++)
{
Images[i] = backUpImages[i];
}
free(backUpImages);
imagesLoaded++;
return imagesLoaded+1;
}
Hier noch die Deklarationen der Variablen.
struct SpriteImage {
struct Vector2 size;
Image* theImage;
};
int imagesLoaded;
struct SpriteImage* Images;
struct SpriteImage* backUpImages;
Ich habe auch schon mit pspDebugScreenPrintf() versucht möglichst viele Infos zu sammeln. Alle Werte sind korrekt, aber wenn der filename = "gfx/Hintergrund.png" ist ist ende, dann freezed die PSP. Es werden beim ersten Aufruf genau 12Byte Allocated, beim zweiten 24, etc. habe ich alles schon getestet.
Hat jemand evtl. einen Tipp für mich?
|
|
14.10.2011 10:17 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Was beabsichtigst du mit diesem Code-Segment?
Ich denke, dass du in dem Array den Platz um ein Image erhöhen willst, liege ich da falsch?
Dann könntest du aber viel effizienter mit realloc() arbeiten und dir so einiges ersparen .
mfg D3lta
P.S.: Warum gibst du ImageLoaded+2 zurück?
"Linux is like a tent, no windows, no gates and an apache inside."
|
|
14.10.2011 11:13 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Ich gebe imagesLoaded+1 zurück, was totaler unsinn ist, wie mir eben aufgefallen ist ^^
Jetzt gebe ich imagesLoaded-1 zurück, was richtig ist (Steht für den Index im Array Images).
Ja, ich beabsichtige den Array um eins zu vergrößern.
realloc() wäre eine Möglichkeit, habe ich auch eben getestet.
Selbes Problem....
|
|
14.10.2011 12:00 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Ich habe mir erlaubt deinen Code etwas zu verändern:
int loadSpriteImage(char* filename, int width, int height)
{
// New Code:
int i;
backUpImages = malloc(sizeof(struct SpriteImage) * imagesLoaded);
for(i = 0; i < imagesLoaded; ++i)
{
backUpImages[i] = Images[i];
}
Images = malloc(sizeof(struct SpriteImage) * (++imagesLoaded)); // Hier hängt es
Images[imagesLoaded].size.x = width;
Images[imagesLoaded].size.y = height;
Images[imagesLoaded].theImage = loadImage(filename);
for(i = 0; i < imagesLoaded; ++i)
{
Images[i] = backUpImages[i];
}
free(backUpImages);
return imagesLoaded;
}
Aber ist es so nicht viel einfacher?
int loadSpriteImage(char* filename, int width, int height)
{
// new New Code ;) :
Images = realloc(Images, sizeof(struct SpriteImage) * (++imagesLoaded)); // Hier hängt es
Images[imagesLoaded].size.x = width;
Images[imagesLoaded].size.y = height;
Images[imagesLoaded].theImage = loadImage(filename);
return imagesLoaded;
}
Sieht es so nicht gleich viel einfacher aus?
Liegt der Fehler immer noch an der selben Stelle?
mfg D3lta
P.S.: Ich weiß schon, warum ich auf C++ umgestiegen bin ...
"Linux is like a tent, no windows, no gates and an apache inside."
Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2011 12:24 von D3lta.
|
|
14.10.2011 12:24 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Achso, ich hatte realloc einfach anstatt von malloc() eingesetzt
Aber wenn ich direkt beim realloc() imagesLoaded um 1 erhöhe kriege ich doch einen Buffer Overflow, oder?
Ich meine wenn 12 Bytes reserviert werden ist ja der höchst mögliche Index ohne Buffer Overflow 0, oder?
Dann dürfte imagesLoaded ja nicht inkrementell um eins erweitert werden sondern einfach nur +1 gerechnet werden oder?
und zurückgegeben muss dann nachdem imagesLoaded inkrementell um 1 erhöht wurde mit einem -1.
Also, ich habe mal deine Funktion ein wenig verändert und sie ausprobiert:
int loadSpriteImage(char* filename, int width, int height)
{
// new New Code ;) :
pspDebugScreenPrintf("Realloc() Images!\r\n");
Images = realloc(Images, sizeof(struct SpriteImage) * (imagesLoaded+1)); // Hier hängt es
pspDebugScreenPrintf("Realloc() Sucessfull oO!\r\n");
Images[imagesLoaded].size.x = width;
Images[imagesLoaded].size.y = height;
Images[imagesLoaded].theImage = loadImage(filename);
imagesLoaded++;
return imagesLoaded-1;
}
Allerdings hängt er jetzt AUCH beim raumschiff.png.
|
|
14.10.2011 12:50 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Achso, ich hatte realloc einfach anstatt von malloc() eingesetzt
Aber wenn ich direkt beim realloc() imagesLoaded um 1 erhöhe kriege ich doch einen Buffer Overflow, oder?
Ich meine wenn 12 Bytes reserviert werden ist ja der höchst mögliche Index ohne Buffer Overflow 0, oder?
Dann dürfte imagesLoaded ja nicht inkrementell um eins erweitert werden sondern einfach nur +1 gerechnet werden oder?
und zurückgegeben muss dann nachdem imagesLoaded inkrementell um 1 erhöht wurde mit einem -1.
Also, ich habe mal deine Funktion ein wenig verändert und sie ausprobiert:
int loadSpriteImage(char* filename, int width, int height)
{
// new New Code ;) :
pspDebugScreenPrintf("Realloc() Images!\r\n");
Images = realloc(Images, sizeof(struct SpriteImage) * (imagesLoaded+1)); // Hier hängt es
pspDebugScreenPrintf("Realloc() Sucessfull oO!\r\n");
Images[imagesLoaded].size.x = width;
Images[imagesLoaded].size.y = height;
Images[imagesLoaded].theImage = loadImage(filename);
imagesLoaded++;
return imagesLoaded-1;
}
Allerdings hängt er jetzt AUCH beim raumschiff.png.
Stimmt
Allerdings ist es so trotzdem für mich etwas schöner:
int loadSpriteImage(char* filename, int width, int height)
{
// new New Code ;) :
pspDebugScreenPrintf("Realloc() Images!\r\n");
Images = realloc(Images, sizeof(struct SpriteImage) * (++imagesLoaded)); // Hier hängt es
pspDebugScreenPrintf("Realloc() Sucessfull oO!\r\n");
Images[imagesLoaded-1].size.x = width;
Images[imagesLoaded-1].size.y = height;
Images[imagesLoaded-1].theImage = loadImage(filename);
return imagesLoaded;
}
Hast du einmal versucht, andere Bilder zu laden, oder alle außer raumschiff.png?
Wieviele Dateien lädt die Funktion denn erfolgreich?
mfg D3lta
P.S.: Warum inkrementierst du den Wert immer um 1 und gibst ihn dann um 1 dekrementiert zurück?
"Linux is like a tent, no windows, no gates and an apache inside."
|
|
14.10.2011 13:15 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Ich inkrementiere um eins, weil wenn der Index 0 vorhanden ist ein Bild geladen ist.
Also ist imagesLoaded - 1 immer der letzt mögliche Index im Images Array.
Die Funktion hat vorher raumschiff.png immer ohne Probleme geladen, nur Hintergrund.png konnte nicht geladen werden. Die PSP Freezed immer, und mit deiner Funktion kann ich auch raumschiff.png nicht laden.
Ich werde nachher mal versuchen andere Bilder zu laden.
|
|
14.10.2011 14:15 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Wenn ich dich richtig verstanden habe, gibst du bei deiner Funktion immer den höchstmöglichen Index zurück, oder?
Es ist aber üblich die Größe zurückzugeben, was ich in meinen Funktionen auch gemacht habe.
Dadurch kommt, wenn du den maximalen Index erwartest, ein Overflow zustande.
mfg D3lta
"Linux is like a tent, no windows, no gates and an apache inside."
|
|
14.10.2011 14:31 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Ich erwarte ja nicht den maximalen Index
Es wird ja von der Funktion zurückgegeben, an welcher Position sich das Bild im Array befindet.
Und genau das bekomme ich beim Laden eines Sprites wieder "mitgeliefert".
Dann wird in einem Sprite Array etwa das gleiche wie bei dem Images Array gemacht (Da funktionierts) und der Sprite gespeichert.
Ich habe auch mal noch andere Bilder ausprobiert. Mit meiner Funktion funktioniert es, die raumschiff.png zu laden, andere Bilder können damit nicht geladen werden.
Mit deiner Funktion stürzt er auch schon beim laden des Raumschiffs ab, wobei ich da einfach keinen Grund sehe.
Warum sollte die PSP beim reservieren von 12 Byte Ram abstürzen? :S
|
|
14.10.2011 17:27 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Ich erwarte ja nicht den maximalen Index
Es wird ja von der Funktion zurückgegeben, an welcher Position sich das Bild im Array befindet.
Und genau das bekomme ich beim Laden eines Sprites wieder "mitgeliefert".
Dann wird in einem Sprite Array etwa das gleiche wie bei dem Images Array gemacht (Da funktionierts) und der Sprite gespeichert.
Ich habe auch mal noch andere Bilder ausprobiert. Mit meiner Funktion funktioniert es, die raumschiff.png zu laden, andere Bilder können damit nicht geladen werden.
Mit deiner Funktion stürzt er auch schon beim laden des Raumschiffs ab, wobei ich da einfach keinen Grund sehe.
Warum sollte die PSP beim reservieren von 12 Byte Ram abstürzen? :S
Ungünstige Speicherauslastung seitens FW?
Mir fällt momentan auch nichts ein, außer ungünstige Zeiger.
Sind die Zeiger global deklariert?
Sind sie mit NULL initialisiert?
mfg D3lta
"Linux is like a tent, no windows, no gates and an apache inside."
Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2011 18:07 von D3lta.
|
|
14.10.2011 18:06 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Ich habe eben die Funktion calloc() "gefunden".
Ich habe sie mal testweise eingebaut und siehe da, alles hat funktioniert.
Ich frage mich nur noch, warum es jetzt damit geht und nicht mit malloc :S
|
|
14.10.2011 18:30 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
calloc() initialisert den reservierten Speicher mit Nullen, aber sonst ist da kein Unterschied
Sind die Zeiger global deklariert?
Sind sie mit NULL initialisiert?
mfg D3lta
"Linux is like a tent, no windows, no gates and an apache inside."
|
|
14.10.2011 19:37 |
|
|
|
Spongy
Neuling
Beiträge: 7
Gruppe: User
Registriert seit: Oct 2011
Status:
Offline
Danke erhalten: 0
|
RE: malloc() freezed PSP
Die Zeiger sind in einer Headerdatei deklariert.
Initialisiert werden sie überhaupt nicht. Das erste mal wenn ein Sprite oder ein Image geladen wird.
|
|
14.10.2011 19:41 |
|
|
|
D3lta
Experte
Beiträge: 663
Gruppe: User
Registriert seit: Dec 2010
Status:
Abwesend
Danke erhalten: 205
|
RE: malloc() freezed PSP
Die Zeiger sind in einer Headerdatei deklariert.
Initialisiert werden sie überhaupt nicht. Das erste mal wenn ein Sprite oder ein Image geladen wird.
Das könnte ein Fehler sein, initialisiere sie in der main() einmal mit NULL und führe dann einmal meine Routine aus.
mfg D3lta
"Linux is like a tent, no windows, no gates and an apache inside."
|
|
14.10.2011 19:53 |
|
|
|