Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 5 von 5
  1. Beiträge anzeigen #1 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline

    Verwendung von lokaler Variable bevor sie deklariert wurde wird vom Parser nicht bemängelt

    Hallo!
    Diese Funktion:
    Code:
    func void nonsense(){
    	var zCVob vob; vob = MEM_PtrToInst(vobPtr);
    	
    	var int vobPtr;
    };
    wird vom Parser nicht bemängelt.
    Ich dachte dann erst ich habe irgendwo eine globale Variable "vobPtr", gibt es allerdings nicht.

    Dieser code:
    Code:
    func void nonsense(){
    	var zCVob vob; vob = MEM_PtrToInst(vobPtr);
    };
    führt korrekterweise zu
    Unknown Identifier: VOBPTR
    Kann mir jemand erklären was da passiert?
    Auch suche ich jetzt nach einer Möglichkeit um alle Skripte auf solche Ungereimtheiten zu untersuchen.

  2. Beiträge anzeigen #2 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Ich könnte mir vorstellen, dass der Parser die Variablendeklarationen innerhalb einer Funktion zuerst sammelt und dadurch nicht erkennt, dass die Variable noch gar nicht deklariert sein sollte.

  3. Beiträge anzeigen #3 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Ich habe dein Beispiel mal kompiliert und mir in DecDat angesehen. Es ist tatsächlich so, dass dem Parser es anscheinend egal ist, wann man eine lokale Variable deklariert:

    Code:
    42077A  pushv    nonsense.vobptr
    42077F  call     mem_ptrtoinst
    420784  pushin   nonsense.vob
    420789  ains     
    42078A  retn

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Der Parser ist da ein wenig merkwürdig, denn folgendes sollte (glaube ich) nicht kompilieren:


    Code:
    func void nonsense(){
    	vobPtr = 3;
    	
    	var int vobPtr;
    };
    Wenn die Variablen in einem Ausdruck (oder nur bei Funktionsparametern?) verwendet werden, werden die erst später gelinkt - wenn die Variable schon bekannt ist. Ist ganz praktisch, weil man dann z.B. MEM_Call(foo); verwenden kann, um foo() aufzurufen, obwohl die Funktion später deklariert wurde.

  5. Beiträge anzeigen #5 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Danke, das hat etwas Licht ins Dunkel gebracht.

    Zitat Zitat von Lehona Beitrag anzeigen
    Der Parser ist da ein wenig merkwürdig, denn folgendes sollte (glaube ich) nicht kompilieren:
    Code:
    func void nonsense(){
    	vobPtr = 3;
    	
    	var int vobPtr;
    };
    Ich habe es mal probiert: Ja, wird nicht kompiliert.
    Zitat Zitat von Lehona Beitrag anzeigen
    Ist ganz praktisch, weil man dann z.B. MEM_Call(foo); verwenden kann, um foo() aufzurufen, obwohl die Funktion später deklariert wurde.
    Sehe ich ein, bei mir hatte solch ein Schludrigkeitsfehler halt Probleme gemacht die etwas schwer zu debuggen waren.

    Statische code Analyse um zu prüfen ob das bei anderen Variablen auch noch so gemacht wird wäre schon praktisch.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide