|
3 registered members (AndrewAMD, Grant, Neb),
908
guests, and 6
spiders. |
|
Key:
Admin,
Global Mod,
Mod
|
|
|
Empty Pointer Error - Brauche Hilfe!
#297160
11/05/09 17:51
11/05/09 17:51
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Hallo Leute, ich hab hier eine Action, bei der ich unter merkwürdigen Umständen einen Empty Pointer Fehler bekomme. Hier mal etwas Code:
action alien1_1_act()
{
while(1)
{
if(my.energie <= 0)
{
// ich bin hinüber
[...]
ent_remove(me); // Mich selbst entfernen
break;
}
else
{
[...]
c_move(me, vector(5*my.geschwindigkeit*time_step,0,0), vector((-1*fluggeschwindigkeit)*time_step,0,0), (ACTIVATE_PUSH | USE_POLYGON | IGNORE_FLAG2)); // Drohne bewegen
c_rotate(me, vector(-0.1*my.drehgeschwindigkeit*time_step,0,0), (ACTIVATE_PUSH | USE_POLYGON | IGNORE_FLAG2));
my.roll = 5*my.drehgeschwindigkeit; // <- diese Zeile macht Probleme!
[...]
}
wait(1);
}
}
Dabei sind energie, geschwindigkeit und drehgeschwindigkeit Skillwerte. fluggeschwindigkeit ist eine globale Variable. Wenn die Energie (skill1) der Entity auf <=0 herabgesetzt wird, bekomme ich die Empty Pointer Fehlermeldungen. Gut, kann man sich dadurch erklären, dass irgendeine andere Entity versucht, auf den Pointer dieser Entity zuzugreifen. Aber wenn ich die Zeile "my.roll = 5*my.drehgeschwindigkeit;" auskommentiere oder weglasse, funktioniert alles problemlos. Jetzt meine Frage: Wie kann es sein, dass diese Zeile einen Empty Pointer Fehler verursacht? Noch komischer wird es dadurch, dass ich mehrere Empty Pointer Fehlermeldungen hintereinander bekomme. Wie kann das sein? Dank und Gruß derGarv
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#297199
11/05/09 23:06
11/05/09 23:06
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Ich hab inzwischen das Gefühl, dass es rein an der Anzahl der in der Action benutzten my/me-Pointer liegt. Wenn ich weiter vorne in der Action (vor der while-Schleife) den my/me-Pointer noch mehrmals verwende (z.B. zum setzen von Flags), bekomme ich auch wieder die Empty Pointer Fehlermeldung.
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#297202
11/05/09 23:24
11/05/09 23:24
|
Joined: Mar 2008
Posts: 2,247 Baden Württemberg, Germany
Espér
Expert
|
Expert
Joined: Mar 2008
Posts: 2,247
Baden Württemberg, Germany
|
Dann erstell nen lokalen pointer in der action also..
action meine_aktion()
{
ENTITY* ich_pointer = my;
[...]
}
und verwende den statt my/me.. Vielleicht hilfts ja ^^
|
|
|
Re: Empty Pointer Error
[Re: Espér]
#297205
11/05/09 23:38
11/05/09 23:38
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Das hab ich mir auch schon überlegt... Hab es jetzt erstmal so gelöst, dass ich einige Zeilen zusammengefasst hab, so dass der Pointer seltener verwendet werden muss. Und jetzt geht's. Komisch, komisch!
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#297577
11/08/09 14:42
11/08/09 14:42
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Die Frage, die sich jetzt stellt: Gibt es eine Beschränkung hinsichtlich der Häufigkeit, mit der ein Pointer aufgerufen werden darf? Das würde ja sicher des Öfteren zu unerwarteten Fehlern führen!?
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#297885
11/10/09 14:53
11/10/09 14:53
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Bin nun wieder auf das Problem gestoßen. Habe nun auch den Lösungsweg mit einem lokalen Pointer probiert. Leider crasht die Action dann immer an der entsprechenden Stelle. Kann mir aber nicht denken, dass noch niemand das Problem hatte. Hier mal die komplette Action:
action alien1_1_act()
{
my.z = 0;
my.material = mtl_specular;
my.energie = 5; // Energie der Drohne
my.emask |= (ENABLE_PUSH); // Die Drohne reagiert auf Schusstreffer
my.event = alien1_1_event; // Das Event der Drohne
my.typ = gegner;
my.flags |= (POLYGON | FLAG2 | POLYGON | SHADOW | CAST);
var warInnerhalbSpielfeld = 0;
while(1)
{
if(my.energie <= 0 || (istAusserhalbDesSpielbereichs(me) && warInnerhalbSpielfeld == 1))
{
if (anvisierterGegner == me) // Falls die Drohne anvisiert ist (Sekundärwaffe)
{
vorigesZiel(); // Einen neuen Gegner rechts anwählen (falls noch mehr da)
wait(1);
if(anvisierterGegner == me) // Falls noch immer selbst anvisiert
{
naechstesZiel(); // neuen Gegner links anwählen (falls noch mehr da)
wait(1);
if(anvisierterGegner == me) // Falls noch immer selbst anvisiert
anvisierterGegner = NULL; // keinen Gegner anvisieren
}
}
if (anvisierterGegner2 == me) // Falls die Drohne anvisiert ist (Sekundärwaffe)
{
naechstesZiel2(); // Einen neuen Gegner rechts anwählen (falls noch mehr da)
wait(1);
if(anvisierterGegner2 == me) // Falls noch immer selbst anvisiert
{
vorigesZiel2(); // neuen Gegner links anwählen (falls noch mehr da)
wait(1);
if(anvisierterGegner2 == me) // Falls noch immer selbst anvisiert
anvisierterGegner2 = NULL; // keinen Gegner anvisieren
}
}
if(!istAusserhalbDesSpielbereichs(me))
{
VECTOR* explodir;
var i = 3+random(4);
while (i>0){
vec_set(explodir, vector(8-random(16),8-random(16),0));
effect(explo1_effekt, 1, my.x, explodir); // ...Explosion (Feuer)
effect(explo1_smoke_effekt, 1, my.x, vec_normalize(explodir, vec_length(explodir)*0.6)); // ...Explosion (Rauch)
feuerballEffekt(my.x);
i--;
}
gegnerExploSound();
setzePunkte(my.spieler,2);
punkteffekt(2);
if(tutorial_level != 1)
erzeuge_item(munition_items*upgrades_items*energie_items, 3);
}
ent_remove(me); // Mich selbst entfernen
break;
}
else
{
if(my.x > spielfeldMaxX + 100)
{
my.x -= fluggeschwindigkeit*time_step;
}
else
{
alien1_1_hauptantrieb_duese();
if(warInnerhalbSpielfeld == 0 && !istAusserhalbDesSpielbereichs(me))
{
warInnerhalbSpielfeld = 1;
}
c_move(me, vector(5*my.geschwindigkeit*time_step,0,0), vector((-1*fluggeschwindigkeit)*time_step,0,0), (ACTIVATE_PUSH | USE_POLYGON | IGNORE_FLAG2)); // Drohne bewegen
c_rotate(me, vector(-0.1*my.drehgeschwindigkeit*time_step,0,0), (ACTIVATE_PUSH | USE_POLYGON | IGNORE_FLAG2));
my.roll = 5*my.drehgeschwindigkeit;
if(is(my, aggressiv))
{
if(random(1000) > 999)
{
ent_create("gegner_geschoss1.tga", my.x, gegner_geschoss1_action); // Schießen
}
}
if(sekundaerwaffe_freigegeben == 1 || sekundaerwaffe2_freigegeben == 1)
{
if (anvisierterGegner == NULL && !istAusserhalbDesSpielbereichs(me)) // Falls kein Gegner anvisiert (Sekundärwaffe) und Drohne auf Spielfeld
{
anvisierterGegner = me; // Drohne anvisieren
}
if (neuesZielLinks == 1 && !istAusserhalbDesSpielbereichs(me)){ // Falls linker Gegner anvisiert werden soll und Drohne auf Spielfeld
if(my.y > anvisierterGegner.y) // Falls weiter links als anvisierter Gegner
{
if(neuerAnvisierterGegner != NULL) // Falls schon ein potentieller neuer anvisierter Gegner
{
if (my.y < neuerAnvisierterGegner.y) // Falls Drohne weiter links als potentieller neuer anvisierter Gegner
neuerAnvisierterGegner = me; // Drohne wird potentieller neuer anvisierter Gegner
}
else // Falls noch kein potentieller neuer anvisierter Gegner
{
neuerAnvisierterGegner = me; // Drohne wird potentieller neuer anvisierter Gegner
}
}
}
if (neuesZielRechts == 1 && !istAusserhalbDesSpielbereichs(me)){ // Falls rechter Gegner anvisiert werden soll und Drohne auf Spielfeld
if(my.y < anvisierterGegner.y) // Falls weiter rechts als anvisierter Gegner
{
if(neuerAnvisierterGegner != NULL) // Falls schon ein potentieller neuer anvisierter Gegner
{
if (my.y > neuerAnvisierterGegner.y) // Falls Drohne weiter rechts als potentieller neuer anvisierter Gegner
neuerAnvisierterGegner = me; // Drohne wird potentieller neuer anvisierter Gegner
}
else // Falls noch kein potentieller neuer anvisierter Gegner
{
neuerAnvisierterGegner = me; // Drohne wird potentieller neuer anvisierter Gegner
}
}
}
if (anvisierterGegner2 == NULL && !istAusserhalbDesSpielbereichs(me)) // Falls kein Gegner anvisiert (Sekundärwaffe) und Drohne auf Spielfeld
{
anvisierterGegner2 = me; // Drohne anvisieren
}
if (neuesZielLinks2 == 1 && !istAusserhalbDesSpielbereichs(me)){ // Falls linker Gegner anvisiert werden soll und Drohne auf Spielfeld
if(my.y > anvisierterGegner2.y) // Falls weiter links als anvisierter Gegner
{
if(neuerAnvisierterGegner2 != NULL) // Falls schon ein potentieller neuer anvisierter Gegner
{
if (my.y < neuerAnvisierterGegner2.y) // Falls Drohne weiter rechts als potentieller neuer anvisierter Gegner
neuerAnvisierterGegner2 = me; // Drohne wird potentieller neuer anvisierter Gegner
}
else // Falls noch kein potentieller neuer anvisierter Gegner
{
neuerAnvisierterGegner2 = me; // Drohne wird potentieller neuer anvisierter Gegner
}
}
}
if (neuesZielRechts2 == 1 && !istAusserhalbDesSpielbereichs(me)){ // Falls rechter Gegner anvisiert werden soll und Drohne auf Spielfeld
if(my.y < anvisierterGegner2.y) // Falls weiter rechts als anvisierter Gegner
{
if(neuerAnvisierterGegner2 != NULL) // Falls schon ein potentieller neuer anvisierter Gegner
{
if (my.y > neuerAnvisierterGegner2.y) // Falls Drohne weiter rechts als potentieller neuer anvisierter Gegner
neuerAnvisierterGegner2 = me; // Drohne wird potentieller neuer anvisierter Gegner
}
else // Falls noch kein potentieller neuer anvisierter Gegner
{
neuerAnvisierterGegner2 = me; // Drohne wird potentieller neuer anvisierter Gegner
}
}
}
}
}
wait(1);
}
}
}
Das Problem tritt in der Zeile "feuerballEffekt(my.x);" auf. Ist das ein Bug oder hab ich einen Fehler gemacht? Dank und Gruß derGarv
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#298068
11/11/09 18:51
11/11/09 18:51
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
Habe festgestellt, dass das Problem auch auftritt, wenn der my pointer in durch die action aufgerufenen funktionen benutzt wird.
Das kann ja irgendwie nicht sein!?
GameStudio Version: A7 Pro v7.86
|
|
|
Re: Empty Pointer Error
[Re: garv3]
#298145
11/12/09 14:15
11/12/09 14:15
|
Joined: Jan 2005
Posts: 605 Deutschland, NRW
garv3
OP
User
|
OP
User
Joined: Jan 2005
Posts: 605
Deutschland, NRW
|
I replaced all my/me pointers in functions called by this action with local pointers. But still no luck. I get crashes and Empty Pointer exeptions for this action again and again. Sometimes even the whole engine crashes...
If someone would be willing to help me, I'd send him/her the code! I'm so desperate...
-----
Ich hab nun alle my/me Pointer in Funktionen, welche von dieser Action aufgerufen werden, durch lokale Pointer ersetzt. Aber immer noch keine Besserung. Ich bekomme immer wieder Crashes und Empty Pointer Exeption Meldungen für diese Funktion. Manchmal stürzt auch die gesamte Engine ab....
Wenn jemand bereit ist mir zu helfen, schicke ich ihm/ihr gerne den Code. Ich bin echt verzeweifelt!
EDIT: Solved! Gelöst! It was just "VECTOR* explodir;". Has to be "VECTOR explodir;" *g* War einfach nur "VECTOR* explodir;". Es muss "VECTOR explodir;" sein *g*
Last edited by garv3; 11/12/09 16:38.
GameStudio Version: A7 Pro v7.86
|
|
|
|