Seite 1 von 1
Rekursive Makros
Verfasst: 25.05.2016 11:03
von Imhotheb
Grüße Zusammen,
habe gerade festgestellt das
PB-Hilfe hat geschrieben:... Die Makros können rekursiv verwendet werden; ...
nicht so ganz zutrifft.
Dazu ein einfaches Beispiel:
Code: Alles auswählen
Macro IncludeData(Length, Value)
CompilerIf MacroExpandedCount <= Length
Data.b Value
IncludeData(Length, Value)
CompilerEndIf
EndMacro
DataSection
IncludeData(100, $23)
EndDataSection
Wollte das Makro verwenden um schnell und einfach "Platzhalter" zu erstellen, aber scheint ja so nicht zu funktionieren.
Die Meldung vom Compiler: "Endlose Rekursivität im Makro festegestellt", sollte vielleicht nicht gleich nach der 2. Erweiterung auftauchen
Wie oft durchläuft der precompiler von pb den code? Bis alles aufgelöst ist, oder nur x Durchläufe?
Re: Rekursive Makros
Verfasst: 25.05.2016 14:29
von #NULL
wenn man statt 100 als length 0 angibt dann sieht mann dass das CompilerIf zu dem zeitpunkt noch gar nicht evaluiert wird und er genauso mit dem 2 durchlauf abricht.
Re: Rekursive Makros
Verfasst: 25.05.2016 15:55
von NicTheQuick
Ich habe auch noch nicht herausgefunden, was hier mehr Priorität hat. 'CompilerIf' oder 'Macro' oder 'MacroExpandedCount'. Das ist teilweise ganz schön unlogisch in PB.
Re: Rekursive Makros
Verfasst: 25.05.2016 19:19
von Nino
Ich würde gern wissen, wie denn eine gültige rekursive Makrodefinition aussieht. Ein Beispiel in der Hilfe wäre sicher nützlich.
( Ein "Anfänger"-Thema ist dies allerdings wohl eher nicht.
)
Re: Rekursive Makros
Verfasst: 25.05.2016 22:00
von #NULL
freak meint erst Macro dann CompilerIf
http://www.purebasic.fr/english/viewtop ... 52#p134252
hab ich auch nur gefunden weil ich nicht weiß wie rekursion mit macros funktionieren soll, wenn nicht mit CompilerIf. die hilfe sagt mittels '#', versteh ich aber trotzdem nicht.
Re: Rekursive Makros
Verfasst: 26.05.2016 00:11
von GPI
Das klappt schon mal nicht:
Code: Alles auswählen
Macro part1
re
EndMacro
Macro part2
cu
EndMacro
Macro recu(a,b)
CompilerIf a<b
part1#part2(b,a)
CompilerElse
Debug ""+a+" "+b
CompilerEndIf
EndMacro
recu(10,11)
Mal ehrlich, rekursive Makros? Wie soll das gehen? Man kann ja keine Abbruchbedingung definieren.
Kann es sein, das ein Makro-Aufruf in einen Makro möglich ist? Das ist aber doch nicht rekursive...
Re: Rekursive Makros
Verfasst: 26.05.2016 13:02
von Imhotheb
Dank an allen die sich hier beteidigen.
Scheint so, als gibt es im Moment da keine Lösung.
Der Vollständigkeit halber, hier noch meine Versuche (die allerdings alle
nicht funktionieren) ... und jetzt gehen mir auch langsam die Ideen aus
Code: Alles auswählen
Macro IncludeData(Length, Value)
CompilerIf MacroExpandedCount <= Length
UndefineMacro Inc2
Macro Inc2(Length, Value)
Data.b Value
IncludeData(Length, Value)
EndMacro
CompilerElse
UndefineMacro Inc2
Macro Inc2(Length, Value)
EndMacro
CompilerEndIf
Inc2(Length, Value)
EndMacro
; klappt nicht
; -------------------------------------------
; Macro Inc2(Length, Value)
; EndMacro
;
; Macro Check(Length)
; CompilerIf MacroExpandedCount <= Length
; UndefineMacro Inc2()
; Macro Inc2(Length, Value)
; Data.b Value
; IncludeData(Length, Value)
; EndMacro
; CompilerEndIf
; EndMacro
;
; Macro IncludeData(Length, Value)
; Check(Length)
; Inc2(Length, Value)
; EndMacro
; klappt nicht
; --------------------------------------------
; Macro Inc2(Length, Value)
; Data.b Value
; IncludeData(Length, Value)
; EndMacro
;
; Macro Check(Length)
; CompilerIf MacroExpandedCount <= Length
; EndMacro
;
; Macro IncludeData(Length, Value)
; Check(Length)
; Inc2(Length, Value)
; CompilerEndIf
; EndMacro
; klappt auch nicht
; --------------------------------------------
; Macro Inc2(Length, Value)
; Data.b Value
; IncludeData(Length, Value)
; EndMacro
;
; Macro IncludeData(Length, Value)
; CompilerIf MacroExpandedCount <= Length
; Inc2(Length, Value)
; CompilerEndIf
; EndMacro
DataSection
IncludeData(100, $23)
EndDataSection