Macro CompilerIf Kombination

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Macro CompilerIf Kombination

Beitrag von Josh »

Warum läuft der folgende Code bei jedem zweiten Aufruf auf einem Fehler. Anschließend muss ich den Compiler neu starten.

Code: Alles auswählen

  Macro CompIf
    CompilerIf 0
  EndMacro

  Macro MyMacro
    CompilerIf #PB_Compiler_Debugger
    CompilerEndIf
  EndMacro

  CompIf
  CompilerEndIf

  MyMacro
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Macro CompilerIf Kombination

Beitrag von STARGÅTE »

Der Code sollte schon nicht beim ersten mal laufen!

Du musst folgendes bedenken.
Sobald CompIf aufgerufen wird, wird in das Macro CompIf gesprungen, dort steht nun ein CompilerIf 0
Das heißt, es wird nichts mehr vom Kompiler gelesen bis ein CompilerEndIf kommt, dass heiß, das EndMacro von CompIf wird übersprungen!!

Das hießt, er ließt weiter bis CompilerEndIf in MyMacro, danach kommt das EndMacro, also springt er zurück.
Nun arbeitet er normal weiter und bekommt nun ein weiters CompilerEndIf vorgesetzt, -> Error
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Macro CompilerIf Kombination

Beitrag von Josh »

Hilfe hat geschrieben:Ein Makro ist ein Platzhalter für etwas Code (ein Schlüsselwort, eine Zeile oder auch viele Zeilen), welcher (beim Kompilieren) direkt an der Stelle, wo das Makro aufgerufen wird, in den Programmcode eingefügt wird.
Nach dieser Beschreibung wird der 'Platzhalter' des Makros einfach durch den 'Makrocode' ersetzt und dann das Programm abgearbeitet. In diesem Fall würde der Code nach Auflösen des Makros CompIf wie folgt aussehen und wäre Ok :|

Code: Alles auswählen

  Macro MyMacro
    CompilerIf #PB_Compiler_Debugger
    CompilerEndIf
  EndMacro

  CompilerIf 0
  CompilerEndIf

  MyMacro
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Macro CompilerIf Kombination

Beitrag von STARGÅTE »

Das stimmt zwar schon, aber der PB-Compiler ist ein Single-Pass-Kompiler.
Das heißt, der Code wird nur ein einziges mal gelesen, soll heißen, es wird nicht erst nach Macros gesucht, dann nach CompilerIf dann nach ..., sondern immer nur zeilenweise gearbeitet.

Nun gibt es drei Bedingungen:
- Wird ein CompilerIf gelesen und es ist False, dann wird kein Code interpretiert, außer er heißt CompilerEndIf oder -Else.
- Wird ein Macro gelesen, wird der Code übersprungen, bis ein EndMacro kommt.
- Wird ein MacroName gelesen, wird zu der Definition des Macros gesprungen und der Code dort gelesen bis ein EndMacro kommt.

Dein EndMacro oben bei CompIf, wird also wenn das Macro aufgerufen wird, garnicht gelesen, weil es ja nach CompilerIf 0 kam.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Macro CompilerIf Kombination

Beitrag von Josh »

Hmmm, ganz logisch ist dieser Ablauf zwar nicht und würde sich auch in einem Single-Pass-Compiler anders lösen lassen, aber ist halt so.

Das haut mir jetzt einiges durcheinander, wofür ich eine Lösung brauche. Das poste ich aber extra im Fragenforum.
Antworten