"stack overflow" (?!)

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

"stack overflow" (?!)

Beitrag von falko-diekmann »

Hallo,

nach längerer Forums-Abstinenz habe ich nun doch mal wieder ein Problem (wäre ja auch ohne irgendwie langweilig ;))

Die Situation mal kurz:

Ich habe gerade 4 neue Global Ints und strings in das script reingebastelt.

Wenn ich nun das Spiel starte läuft noch das Intro-Video ab, danach kommt sofort die Fehlermeldung "stack overflow".

Die komplette Fehlermeldung heisst :

"Error: run_text_script1: error -6 running function "repeatedly_execute":
Error: stack overflow
in Global script (line 75)"

Line 75 ist natürlich die wo die neuen 4 strings stehen.

Natürlich dachte ich jetzt zuerst: Ich hab wohl zuviele strings da drin, geht halt nicht.

Dem ist aber nicht so:

Laut ags-Hilfe sind 50 strings möglich und ich habe bei mir jetzt gerade 23 gezählt. Jetzt ist natürlich 23 eine ungünstige Zahl ;) aber ich weigere mich zu glauben das es daran liegt;)

Ich habe jetzt schon einige scripts aus dem global "repeatedly" rausgenommen und in die room-repeatedly´s gesteckt...anfangs habe ich da nicht so drauf geachtet.

Aber daran liegt´s auch nicht.

Ab den neuen 4 strings läuft es einfach nicht mehr.

Ich hoffe wirklich das jemand nen Lösungsansatz hat, ich habe mittlerweile so viel Zeit und Mühe in das Spiel gesteckt das es echt kagge wäre wenn´s jetzt an 4 strings scheitern soll. Trennen möchte ich mich von denen eigentlich nicht.

Vorsichtshalber poste ich hier jetzt mal mein komplettes repeatedly execute script. Vielleicht erkennt ja jemand das Problem.

line 75 ist die wo der string "kills" steht:


function repeatedly_execute() {

string Gesundheit; //Brandywine
string Erfahrung;
string Geisteszustand;
string Energiewaffen;
string Schlaegerei;
string ErsteHilfe;
string brandy;
string LVLBRA; //LevelUP-Punkte

string G; //Baldwin
string GZ;
string EH;
string EW;
string Schl;
string Erf;
string Bald;
string LVLBAL; //LevelUP-Punkte

string Gegner; //Gegner-Lebenskraft für Brandywine
string Geg; //Gegner_Lebenkraft für Baldwin

string Zriddle; //Zahlenrätsel

string kills; //getötete Gegner
string riddles; //gelöste Rätsel
string clothes; //Verkleidungen
string allies; //Verbündete

StrFormat (Gesundheit, "%d", GetGlobalInt (1));
StrFormat (Erfahrung, "%d", GetGlobalInt (2));
StrFormat (Geisteszustand, "%d", GetGlobalInt (3));
StrFormat (Energiewaffen, "%d", GetGlobalInt (4));
StrFormat (Schlaegerei, "%d", GetGlobalInt (5));
StrFormat (ErsteHilfe, "%d", GetGlobalInt (6));
StrFormat (brandy, "%d", GetGlobalInt (1));
StrFormat (LVLBRA, "%d", GetGlobalInt (22));
lbl_Gesundheit.SetText(Gesundheit);
lbl_Erfahrung.SetText(Erfahrung);
lbl_Geisteszustand.SetText(Geisteszustand);
lbl_Energiewaffen.SetText(Energiewaffen);
lbl_Schlaegerei.SetText(Schlaegerei);
lbl_ErsteHilfe.SetText(ErsteHilfe);
lbl_brandy.SetText(brandy);
lbl_LVLBRA.SetText(LVLBRA);

StrFormat (G, "%d", GetGlobalInt (8));
StrFormat (Erf, "%d", GetGlobalInt (9));
StrFormat (GZ, "%d", GetGlobalInt (10));
StrFormat (EW, "%d", GetGlobalInt (11));
StrFormat (Schl, "%d", GetGlobalInt (12));
StrFormat (EH, "%d", GetGlobalInt (13));
StrFormat (Bald, "%d", GetGlobalInt (8));
StrFormat (LVLBAL, "%d", GetGlobalInt (23));

lbl_G.SetText(G);
lbl_Erf.SetText(Erf);
lbl_GZ.SetText(GZ);
lbl_EW.SetText(EW);
lbl_Schl.SetText(Schl);
lbl_EH.SetText(EH);
lbl_Bald.SetText(Bald);
lbl_LVLBAL.SetText(LVLBAL);

StrFormat (Gegner, "%d", GetGlobalInt (7));
lbl_Gegner.SetText(Gegner);

StrFormat (Geg, "%d", GetGlobalInt (7));
lbl_Geg.SetText(Geg);

StrFormat (Zriddle, "%d", GetGlobalInt (14));
lbl_Zriddle.SetText(Zriddle);

StrFormat (kills, "%d", GetGlobalInt (25));
StrFormat (riddles, "%d", GetGlobalInt (26));
StrFormat (clothes, "%d", GetGlobalInt (27));
StrFormat (allies, "%d", GetGlobalInt (28));
lbl_kills.SetText(kills);
lbl_riddles.SetText(riddles);
lbl_clothes.SetText(clothes);
lbl_allies.SetText(allies);

if (GetGlobalInt (1) < 1) {
character[EGO].ChangeRoom(8);
} //Brandywine Game over

if (GetGlobalInt (8) < 1) {
character[BALD1].ChangeRoom(28);
} //Baldwin Game over

//Level-UP für Brandywine :
if ((GetGlobalInt(2) > 50) && (GetGlobalInt(5) == 1)) {
SetGlobalInt(20,1);
SetGlobalInt(22,10);
SetGlobalInt(5,2);
}

if (GetGlobalInt(20) == 1) {
gLevupbrandy.Visible = true;
gBrandywine.Visible = true;
gIconbar.Visible = false;
PlayMusic(19);
SetGlobalInt(20,0);
mouse.UseModeGraphic(eModePointer);
}


//Level-UP für Baldwin :
if ((GetGlobalInt(9) > 50) && (GetGlobalInt(12) == 1)) {
SetGlobalInt(21,1);
SetGlobalInt(23,10);
SetGlobalInt(12,2);
}

if (GetGlobalInt(21) == 1) {
gLevupbald.Visible = true;
gBaldwin.Visible = true;
gIconbar.Visible = false;
PlayMusic(19);
SetGlobalInt(21,0);
mouse.UseModeGraphic(eModePointer);
}
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Hat es irgendeine logische Begründung dafür, dass du sämtliche strings in der rep_ex erschaffst? Die gehören davor, ganz an den Anfang des global scripts.

Was bei dir passiert ist folgendes:
Die strings werden einmal erschaffen, wenn die rep_ex zum ersten Mal aufgerufen wird, dann wieder beim zweiten Mal, dann beim dritten Mal, usw. Eigentlich logisch, dass das irgendwann zu einer Überlastung führt - so verständlich ausgedrück wie ich es gerade hinbekomme.

Ich hab mir den Code jetzt nicht ganz im Detail angesehen, aber wenn du alle Zeilen, die mit string anfangen außerhalb jeder Funktion setzt und nur den anderen Rest darin lässt (der muss wahrscheinlich drin bleiben, soweit ich das auf den ersten Blick sehe) müsste es klappen.
Noch ein kleiner Rat am Rande: wenn du viele Globale Variablen brauchst würde ich davon abraten die GlobalInts zu verwenden, das wird leicht unübersichtlich.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

Mit ganz an den Anfang setzen meinst du die Sektion "game_start", oder?

Ich werde das mal gleich testen.

Ich habe das in der Hilfe aber so verstanden das die strings immer wieder aktualisert werden müssen weil sie ja variable Werte anzeigen, oder vertue ich mich da jetzt mit den labels?

Ich werd´s auf jeden Fall mal ausprobieren :)

Danke erstmal.
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

Ich hab das jetzt mal ausprobiert, leider funktioniert es so aber nicht.
Wenn ich die strings nach oben verfrachte meldet ags beim kompilieren das das "token" kills "undefined" ist.

Danach geht dann gar nichts mehr.

Ich hab den ganzen Mist jetzt erstmal wieder da raus gerupft und kümmere mich um andere Sachen.

Zur Not verzichte ich halt auf diese eine GUI. Man muss ja auch nicht zwingend wissen wieviele Gegner man überwunden hat ;)
Smiley
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 163
Registriert: 28.04.2005, 16:26
Wohnort: Mönchengladbach

Beitrag von Smiley »

Du musste die strings außerhalb einer Funktion deklarieren.

so:

Code: Alles auswählen

string Gesundheit;

function repeatedly_execute() {
}
deklarierst du den string Gesundheit global für alle Funktionen im Skript.

so:

Code: Alles auswählen

function repeatedly_execute() {
string Gesundheit;
}
wird Gesundheit nur lokal für repeatedly_execute deklariert.

Und da AGS nur eine begrenzte Anzahl von lokalen Variablen für eine Funktion vertragen kann (http://americangirlscouts.org/agswiki/Engine_limits), kommt ne Fehlermeldung.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Sinitrena hat geschrieben:aber wenn du alle Zeilen, die mit string anfangen außerhalb jeder Funktion setzt
Also NICHT in game_start, AUSSERHALB.

Eine Variable/String, die/der innerhalb einer Funktion definiert wird, gilt auch nur innerhalb der Funktion, d.h. sie ist nach Ablauf 0 bzw. "".
In diesem Fall ist das egal, da Du die Strings eh nur benutzt, um Label zu aktualisieren.

Mach es einfach so:

Code: Alles auswählen

function update_label(Label*l, int gi) {
  l.SetText(String.Format("%d", GetGlobalInt(gi));
}

function update_player() {
  update_label(lbl_Gesundheit, 1);
  update_label(lbl_Erfahrung, 2);
  update_label(lbl_Geisteszustand, 3);
  ... usw.
}

function repeatedly_execute() {
  update_player();
}
Use gopher repellent on funny little man
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

OK, jetzt habe ich das glaube ich erst verstanden...mit dem AUSSERHALB jeder Funktion.

Hab´s gleich mal getestet.

Wahrscheinlich überrascht es niemanden das es jetzt tatsächlich funktioniert.

Ein Glück das ich die Hintergrundgrafiken und alles nicht schon gelöscht hatte.

Vielen Dank für die Hilfe :D :D :D :D
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Ach, es ist schon schwer richtig zu lesen, nicht wahr? :lol:

Aber es ist gut, dass es jetzt geht.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

He!

Ich bin halt nur ein Verpackungswegwerfer...die lesen sich nie alles richtig durch ;)
Antworten