1

Freitag, 25. August 2006, 23:25

Ich wusste nicht, in welchen Thread das muss, deshalb habe ich es einfach hier rein gemacht.

Also, vielen Skriptern ist es bestimmt schon aufgefallen: An manchen Stellen verursacht der 'alias' Befehl eine Fehlermeldung wenn man das Spiel mit F12 neustartet.

Dann bekommt man folgende Meldung:

Zitat


System stack Error

stack level too deep


Doch diesen Bug kann man jedoch ganz einfach beheben.

1. Im Skript 'Main' erstellt man eine neue Globalvariabel die speichert, ob das Programm schon mal gestartet wurde, z.B.

Quellcode

1
$started = true


2. Hinter den alias Befehl kommt dann eine Abfrage ob das Programm schon mal gestartet wurde:

Quellcode

1
alias class_original class if $started == nil


Und dann sollte es schon funktionieren^^

Warscheinlich wissen es schon die meisten, aber ich habe noch keine Lösung im Netz dazu gefunden... Deshalb habe ich diesen Thread einfach mal aufgemacht.

Mfg Monsta

2

Freitag, 25. August 2006, 23:30

Hi^^
Find ich gut von dir, dass du das gemacht hast.
Hab das nicht gewusst.
Danke^^
MfG
CloudMX

3

Samstag, 26. August 2006, 13:08

Danke, wird mir sicherlich bei einigen Scripten helfen. Da ich nicht sondelrich gut Scripten kann kannte ich es ebenfalls nicht :p

4

Donnerstag, 8. März 2007, 21:39

Weiß wer was folgendes heißt?

Zitat

TypeError occured while running script
cannot iterate from Float
There was a Cave,
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.

5

Donnerstag, 8. März 2007, 22:36

iteratte hat etwas mit Arrays zu tun und Float ist ein Datentyp.
Ich vermute eine schleife oder so aht versucht durch ein Array zu laufen, aber es war kein Array sondern eine var vom typ float und das klappt nicht.
Gamedev-Nation.org - Die freundliche Spieleentwickler Community

I am sick of it to be a beta nerd. So I have decided to become a alpha!

6

Donnerstag, 8. März 2007, 22:52

Kannst du mal die Zeile posten wo der Fehler auftritt?
Und was hat das mit meinem Tutorial zu tun? >.<

7

Montag, 12. März 2007, 22:06

@Topic: Aber das ist doch kein Bug!
Im Grunde kopiert die Alias-Methode nur eine Methode.

Quellcode

1
alias :copied_method :original_method

So wird die Methode :original_method kopiert und unter dem Namen :copied_method gespeichert. Alias wird häufig dazu verwendet, schon definierten Methoden weitere Anweisungen hinzuzufügen. Dabei wird erst die ursprüngliche Methode kopiert, dann überschrieben. In der neuen Methodendefinition wird dann die Kopie der alten Methode aufgerufen:

Quellcode

1
2
3
4
5
6
7
8
9
10
#alte Methode kopieren
alias :copied_method :original_method
 
#Methode neu definieren (überschreiben)
def original_method
  #Kopie der alten Methode aufrufen
  copied_method
  #neue Anweisungen hinzufügen
  blablabla
end


Auf diese Weise werden oft Standardscripts verändert, z.B. die Initialize-Methode von Game_Temp zur Initialisierung von neuen Instanzvariablen. Problematisch wird es aber dann, wenn dies mehrmals unter gleichem Namen passiert, denn führt der Aufruf einer der Alias-Methoden zu einer endlosen Rekursion, da immer wieder die gleiche Methode aufgerufen wird. Daher gibt es an dieser Stelle einen System Stack Error.

Man muss also nur darauf achten, dass nie zwei Methoden unter gleichem Namen kopiert werden, dann tritt der Fehler auch nicht auf. Ich gebe meinen Alias-Methoden inzwischen immer kontextbezogene Namen, z.B. "questlog_init" für die Game_Temp-Initialize-Erweiterung in meinem Questlog-Script, so dass keine Gefahr besteht, dass in einem anderen Script der gleiche Name für die gleiche Methode gebraucht wird.
Spoiler: Das neue RGSS Preisrätsel
Wie lassen sich die Werte zweier Integervariablen vertauschen? Machen Sie mit und gewinnen Sie Ruhm und Ehre! ?"Caesar"? Die kürzeste Lösung gewinnt. Gibt es mehrere richtige Einsendungen, wird ein zufälliger Gewinner aus diesen gezogen.
zum Lesen den Text mit der Maus markieren
Spoiler: Auflösung der letzten Runde
Die Aufgabe der letzten Runde lautete:

Zitat

Schreiben Sie einen Parser für die ASCII-Form des Dateiformats PBM (Portable Bitmap). Die Methode soll als Parameter einen Dateinamen erhalten und eine Bitmap zurückgeben. 0 ist weiß, 1 ist schwarz. Eine Beispieldatei, die den Buchstaben 'A' darstellti:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
P1
9 9
000010000
000010000
000101000
000101000
001000100
001111100
001000100
010000010
111000111
Es hat keiner teilgenommen, daher gibt es keinen Gewinner ^^ Eine mögliche Lösung wäre gewesen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def parse_pbm(filename)
  f = File.open(filename)
  return nil unless f.readline.chomp == "P1"
  width, height = f.readline.split(' ').collect {|i| i.to_i}
  bitmap = Bitmap.new(width, height)
  c0 = Color.new(255, 255, 255)
  c1 = Color.new(0, 0, 0)
  for iy in 0...height
    f.readline.chomp.split('').each_with_index do |v, k|
      bitmap.set_pixel(k, iy, v == '0' ? c0 : c1)
    end
  end
  return bitmap
end
zum Lesen den Text mit der Maus markieren
Spoiler: Schon gewusst?
...wie man zum Testen schnell einzelne Scripts "ausbaut", ohne das Script aus dem Scripeditor zu löschen? Ganz einfach: Man fügt im Scripteditor ganz oben im Script die folgende Zeile ein:

Quellcode

1
if false
und ganz unten als letzte Zeile:

Quellcode

1
end
Das hat den gleichen Effekt, wie wenn man das ganze Script aus dem Scripteditor gelöscht hätte.
zum Lesen den Text mit der Maus markieren

8

Montag, 12. März 2007, 23:21

Zitat von »"Caesar"«

@Topic: Aber das ist doch kein Bug!
Im Grunde kopiert die Alias-Methode nur eine Methode.

Quellcode

1
alias :copied_method :original_method

So wird die Methode :original_method kopiert und unter dem Namen :copied_method gespeichert. Alias wird häufig dazu verwendet, schon definierten Methoden weitere Anweisungen hinzuzufügen. Dabei wird erst die ursprüngliche Methode kopiert, dann überschrieben. In der neuen Methodendefinition wird dann die Kopie der alten Methode aufgerufen:

Quellcode

1
2
3
4
5
6
7
8
9
10
#alte Methode kopieren
alias :copied_method :original_method
 
#Methode neu definieren (überschreiben)
def original_method
  #Kopie der alten Methode aufrufen
  copied_method
  #neue Anweisungen hinzufügen
  blablabla
end


Auf diese Weise werden oft Standardscripts verändert, z.B. die Initialize-Methode von Game_Temp zur Initialisierung von neuen Instanzvariablen. Problematisch wird es aber dann, wenn dies mehrmals unter gleichem Namen passiert, denn führt der Aufruf einer der Alias-Methoden zu einer endlosen Rekursion, da immer wieder die gleiche Methode aufgerufen wird. Daher gibt es an dieser Stelle einen System Stack Error.

Man muss also nur darauf achten, dass nie zwei Methoden unter gleichem Namen kopiert werden, dann tritt der Fehler auch nicht auf. Ich gebe meinen Alias-Methoden inzwischen immer kontextbezogene Namen, z.B. "questlog_init" für die Game_Temp-Initialize-Erweiterung in meinem Questlog-Script, so dass keine Gefahr besteht, dass in einem anderen Script der gleiche Name für die gleiche Methode gebraucht wird.


Und? Das weiss ich doch alles -.-
Aber es gibt einfach auch Leute, die die alias angabe nicht so eindeutig in ihre Skripte schreiben. Und wenn da ein Neuling einfach 2 Skripte hinein kopiert die zufällig die selbe Angabe im Alias haben, dann ist das ja wohl eine Ungewollte Codereaktion... Auch Bug genannt. Außerdem geht es nicht nur um 2 Skripte mit dem selben Alias, sondern hauptsächlich um das Problem, dass der alias Befehl an manchen Stellen den besagten Fehler auslöst, wenn man das Spiel mit F12 neustartet. Und das ist wohl auch nicht gewolt :)
Und deshalb sah ich keinen Grund dieses Tutorial nicht zu schreiben...

Mfg Monsta

9

Mittwoch, 28. März 2007, 18:16

:D
wird schon in diversen scripts generell (die das verwenden) schon angewendet ^^. (wobei man dort schon auf globale variablen verzichtet und gleich solche "fehler" beim scripten neutralisiert)
Ist aber eh gut das du das thema mal direkt ansprichst!

Mal sollte aber beachten, das nicht nur mit alias'es so ein problem auftreten kann.

Bei einen einfachen neustart durch F11 können viele fehler auftreten, wobei das spiel normal vor so einen start sich spielen lassen.
Kann zb auftreten, weinn man wo ein bild mit einer globalen variable erstellt, aber dann vergisst diese auch wieder wo zu löschen wenn man es wieder erstellen will.
D.h. man könnte theroretisch noch bestimmte aktionen nach so einen "neustart" abrufen. (von globale variablen)

[COLOR="seagreen"]Mfg[/COLOR]
Markus

Social Bookmarks