Sprungmarke in Macro

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Sprungmarke in Macro

Beitrag von 7x7 »

Wenn ich in einem Macro eine Sprungmarke definiere, habe ich logischerweise das Problem, dass das Macro nicht mehrfach im Sourcecode eingesetzt werden kann, weil der Compiler dann den Fehler "Doppelte Sprungmarke" erzeugt.

Weiss jemand eine geniale Lösung dazu?

Code: Alles auswählen

Macro beispiel
	;hier steht Code
	Sprungmarke:
	;hier gehts weiter
EndMacro

beispiel
beispiel
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Sprungmarke in Macro

Beitrag von NicTheQuick »

Falls du nur innerhalb deines Codes im Makro zu der Sprungmarke springen musst, würde ich es so machen:

Code: Alles auswählen

Macro beispiel
	Repeat
		;hier steht Code
		If (irgendwas)
			Break
		EndIf
		;hier steht noch mehr Code
		Break
	ForEver
EndMacro

beispiel
beispiel 
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Sprungmarke in Macro

Beitrag von Derren »

So wie man das normal auch ohne Sprungmarke löst?

Code: Alles auswählen

Macro Sprung
  ;Hier geht's weiter
EndMacro

Macro Beispiel
  ;Hier steht Code
  Sprung
EndMacro

Beispiel
Beispiel
Der Sinn von einem Macro ist doch, dass man sich wiederholenden Code nicht zweimal schreiben muss.
Die Sprungmarke gehört da einfach nicht rein.

Code: Alles auswählen

Macro Bei
  ;Hier steht Code
EndMacro

Macro Spiel
  ;Hier geht's weiter
EndMacro

Macro Beispiel
  Bei
  Spiel
EndMacro

Bei
Sprungmarke:
Spiel

BeiSpiel
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprungmarke in Macro

Beitrag von STARGÅTE »

Das Problem kann man mit sogenannten anonymen Labels beheben, allerdings sollte man damit vorsichtig umgehen, da nur relative sprünge möglich sind:

Code: Alles auswählen

Macro beispiel
  Debug a
  If a = 1
  	!jmp @f ; springt nach vorne zum nächsten anonymen Label
  EndIf
  Debug "a ist nicht 1"
  !@@: ; Anonymes Label
EndMacro


a = 1

beispiel

a = 2

beispiel
!@@: ist das Label
!jmp @f springt nach vorn und !jmp @b springt zurück.
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
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Sprungmarke in Macro

Beitrag von 7x7 »

NicTheQuick hat geschrieben:..., würde ich es so machen:
Kann ich in meinem Fall nicht so tun
Derren hat geschrieben:Die Sprungmarke gehört da einfach nicht rein
Muss aber :mrgreen:
STARGÅTE hat geschrieben:Das Problem kann man mit sogenannten anonymen Labels beheben...
Genial!

Danke euch!
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Sprungmarke in Macro

Beitrag von Danilo »

So geht es mit generierten Namen, die man auch verschachteln kann:

Code: Alles auswählen

! macro generateLabel {
!  local Label1
!  MyLabel1 equ Label1
! }

Macro beispiel
  !generateLabel    ; neuen Namen für 'MyLabel1' generieren
  Debug a
  If a = 1
     !jmp MyLabel1  ; springt zum dem generierten Label 'MyLabel1'
  EndIf
  Debug "a ist nicht 1"
  !MyLabel1:
  !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
EndMacro


a = 1

beispiel

a = 2

beispiel
Verwende ich bei [Windows XP+] Try .. Catch .. EndTry - Error Handling, wo man die Macros auch verschachteln können muss und ich 3 Labels brauchte.
Mit anonymen Labeln gehen solche Verschachtelungen nicht, da einfach nur zum Nächsten nach vorn oder hinten gesprungen wird.


Beispiel um die Verschachtelung zu sehen:

Code: Alles auswählen

! macro generateLabel {
!  local Label1
!  MyLabel1 equ Label1
! }

Macro beispiel
  !generateLabel ; neuen Namen für 'MyLabel1' generieren
  Debug a
  If a = 1
    !JMP MyLabel1  ; springt zum letzten MyLabel1 im Macro
  EndIf

      !generateLabel    ; neuen Namen für 'MyLabel1' generieren
        !JMP MyLabel1   ; springt in die nächste Zeile, zum aktuellen "MyLabel1"
      !MyLabel1:
      Debug "inneres MyLabel1"
      !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
      ; nach dem restore ist wieder das vorherige MyLabel1 aktuell, also das in der nächsten Zeile
  !MyLabel1:
  Debug "aeusseres MyLabel1"
  !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
EndMacro

a = 1

beispiel

a = 2

beispiel
'MyLabel1:' wird hier 2mal verwendet, aber immer durch einen anderen Namen ersetzt, den '!generateLabel' generiert hat.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Sprungmarke in Macro

Beitrag von 7x7 »

Für meinen Bedarf komme ich im Moment mit den anonymen Labels gut zurecht.

Generierte Namenslabel sind aber auch interessant. Verstehe ich das richtig, dass "Label1" sowas wie ein Counter ist und "MyLabel1 equ Label1" dann ein (bei Aufruf) fortlaufendes Label erstellt?

Eigentlich kann es ja nicht anders sein. Aber da stellt sich in meinem Kopf der Begriff "Local" quer (müsste ja immer bei Aufruf dann "Label1" neu initialisiert werden)?

Muss mich vielleicht doch mal wieder intensiver mit der entsprechenden Assembler-Lektüre beschäftigen
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Sprungmarke in Macro

Beitrag von Danilo »

7x7 hat geschrieben:Verstehe ich das richtig, dass "Label1" sowas wie ein Counter ist
Counter mit Zahlen nicht unbedingt, aber "Local Label1" erstellt immer einen neuen, einmaligen Namen.
Ob man den generierten Name für Variablen oder Labels benutzt ist wohl egal.
7x7 hat geschrieben:und "MyLabel1 equ Label1" dann ein (bei Aufruf) fortlaufendes Label erstellt?
Man kann sagen, MyLabel1 ist sowas wie ein Macro, dem hier der eindeutige Name von Label1 zugewiesen wird.
Überall wo man nun "MyLabel1:" benutzt, wird es wie Macros ersetzt - mit dem automatisch generierten Namen.

"restore" stellt den vorherigen Inhalt des Macros wieder her.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Sprungmarke in Macro

Beitrag von 7x7 »

Ok, das erscheint mir im Moment alles klarer. Vermutlich werde ich aber beim ersten praktischen Einsatz diese Seite noch mal aufrufen müssen... :)

Danke!

Edit:
...generierter Name als Variable?!! Hochinteressant.... :mrgreen:
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Antworten