[PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

[PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von Mok »

Siehe hier. PB4.50 Win32
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von ts-soft »

Ich gehe mal davon aus, was auch logisch wäre, Compilerdirektiven haben Vorrang vor macro,
werden also nicht transportiert. Aufteilung in mehrere macros also nicht möglich.
Damit wären dann auch die meisten Fehlermeldungen erklärt.

Aber genaues sollte wohl besser freak sagen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von STARGÅTE »

eben,

denn eigenlich sollte ja CompilerIf darüber entscheiden welches Macro benutzt wird:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
 Macro Test
  Debug "Juppi"
 EndMacro
CompilerElse
 Macro Test
  Debug "Och nöö"
 EndMacro 
CompilerEndIf
  
Test
ansonsten halt mit einem Trick arbeiten wie ich bei Macros in Macros:

Code: Alles auswählen

Macro __EndM__ 
EndM
EndMacro 
Macro __acro__ 
acro
EndMacro 
Macro FakeEndMacro
:__EndM__#__acro__
EndMacro 


Macro BuildMacro(_Macro, _MacroLine) 
  Macro _Macro 
    _MacroLine
  FakeEndMacro 
EndMacro 

BuildMacro(Add(x,y),x + y) 
BuildMacro(Sub(x,y),x - y) 

Debug Add(3,2) 
Debug Sub(3,2)
Vllt kannst du dieses Beispiel auch bei dir verwenden, indem du die CompilerIfs und EndIfs erst von Macros zusammen bauen lässt.
Sodass sie vorher nicht auftauchen.
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
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von Thorium »

Eigentlich wäre es logischer zuerst die Makros aufzulösen und dann die Compilerdirektiven, so könnten Compilerdirektiven in Makros stehen. Ich sehe dabei keinen Nachteil. Stargates Beispiel würde genauso funktionieren, wenn man anstatt 2 Makros nur eins macht und innerhalb per Compilerdirektiven verzweigt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von freak »

Das Verhalten ist normal und kein Bug.

Es ist ganz simpel:
  • Nach einem CompilerIf was false ergibt wird alles ignoriert bis zu einem CompilerElse oder CompilerEndIf
  • Damit findet auch keine Expansion von Macros statt, weil der Code ja nicht compiliert wird
  • Damit wird auch das Macro in dem CompilerEndIf steht nie expandiert
  • ... und damit wird der CompilerIf-Block nie beendet

Code: Alles auswählen

Macro a()
  CompilerIf 0    ; hat erst einen Einfluss wenn a() benutzt wird, nicht hier bei der Definition
EndMacro
  
Macro b()
  CompilerEndIf   ; hätte auch erst einen Einfluss wenn b() benutzt/expandiert wird, was aber nie passiert (siehe unten)
EndMacro

a()  ; wird expandiert zu "CompilerIf 0", also befinden wir uns in einem Code-Block der ignoriert werden muss

; ...

b()  ; b() wird nie expandiert, weil Code der ignoriert wird bis ein CompilerEndIf gefunden wurde

; Also enden wir hier ohne ein CompilerEndIf
> Eigentlich wäre es logischer zuerst die Makros aufzulösen und dann die Compilerdirektiven, so könnten Compilerdirektiven in Makros stehen.

Genau das trifft auch zu. Compilerdirektiven können in Macros stehen und Macroparameter als Argumente haben. Aber wenn man einen CompilerIf-Block in einem Macro anfängt muss man ihn auch dort beenden weil keine weiteren Macros expandiert werden bis der Block beendet wird. Ist eigentlich logisch.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von STARGÅTE »

jo klingt logisch.

danke für die Erklärung.
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
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros

Beitrag von Nino »

freak,

besten Dank für die gute Erklärung! :allright:
Ich hab' das Zusammenspiel von Makros und Compilerdirektiven jetzt zum 1. Mal verstanden. :-)

Grüße, Nino
Antworten