Code mit aufgelösten Macro Calls

Anfängerfragen zum Programmieren mit PureBasic.
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Code mit aufgelösten Macro Calls

Beitrag von PeterJ »

Gibt es eigentlich die Möglichkeit ein Listing zu erzeugen mit aufgelösten Macro Calls?
Ich hatte gerade ein Problem mit verschachtelten Macros, wo ich 2 Stunden gebraucht habe um einen trivialen Fehler zu finden.
Der Compiler hatte am Schluß ein fehlendes EndIF bemäkelt, und ich konnte die Stelle nicht einem Macro Call zuordnen. Bei einer aufgelösten Version wären es Minuten gewesen!

Nachdem ich schon Tipps für aufgelöste Assembler Listen gefunden habe, gibt es sowas sicher auch für Macros, oder?

Grüße
Peter
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Was sind aufgelöste Assembler Listen und was sollen
aufgelöste Macros sein? Die Frage habe ich nun nicht verstanden.

Meinst du damit die Feherbehandlung die mit debuggen nicht funktioniert?

Bei ASM seht in der Hilfe folgendes:
- Die Fehler in einem ASM Programmteil werden nicht von PureBasic gemeldet, jedoch von FAsm. Überprüfen Sie einfach Ihren Programmcode, wenn ein solcher Fehler auftritt
Und bei Macros wird ein Fenster angezeigt, wenn dieser fehlerhaft ist.

Meinst du das mit aufgelösten Assembler bzw. Macro?


Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Beitrag von PeterJ »

Was meine ich mit aufgelösten Macros: Ein Macro erzeugt einzelne PB Statements. Im Programm selbst schreibe ich dann nur, z.B.
...
MyMacro(parm1,parm2)
...

Was MyMacro letztlich für Code erzeugt, sehe ich nirgends. MyMacro kann syntaktisch korrekt sein, aber trotzdem unvollständigen PB Code erzeugen.
Ich benütze in meinem Fall verschachtelte und verschränkte Macros in dem IF Ketten erzeugt werden. Es wurde dabei ein unvollständiges IF Statement of ENDIF erzeugt. Makrotechnisch war das in Ordnung. Der Fehler wurde mir dann am Ende vom Compiler gemeldet, am Ende der Prozedur, weit außerhalb der Makroverarbeitung.

Ich hätte nun einfach gerne meine erzeugten IF Statements gesehen um den Fehler leichter einzugrenzen und dann das Macro zu korrigieren.
um bei obigen trivialen Beispiel zu bleiben, würde so eine Liste vielleicht so aussehen:

...
;MyMacro(parm1,parm2,label)
IF Parm1>parm2
goto label
elseif parm2<0
goto label
endif
; End MyMaco
...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich kann dir deine eigentliche Frage nicht beantworten, du könntest vielleicht mal
im Internationalen Forum fragen, da antworten auch Fred und Freak selber.

was wir hier aber leisten könnten, wäre das Macro-Verständnis zu erleichtern.
vielleicht hast du also ein Code-Beispiel parat, das diese fehlerhafte If-Kette (Verschachtelung?) erzeugt...?

Eventuell resultiert das Problem ja aus einem unvollständigen Verständnis für die Funktionalität von Macros in PB,
oder vielleicht ist es wirklich eine Schwäche im Macro-Parsing selber.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Beitrag von PeterJ »

Danke, ich werde es gelegentlich im internationalen Forum mit der Frage versuchen
Kaeru Gaman hat geschrieben: Eventuell resultiert das Problem ja aus einem unvollständigen Verständnis für die Funktionalität von Macros in PB,
oder vielleicht ist es wirklich eine Schwäche im Macro-Parsing selber.
oh, mein Verständnis über Macros ist sehr gut :lol: . Ich weiß nicht ob ich es erwähnt habe ich kommen von der IBM Z/OS Seite, und da gibt es den IBM Macro Assembler, den ich ziemlich gut beherrscht habe. Gelernt habe ich das auch nicht erst gestern sondern vor 30 Jahren! IT gab es schon lange for Microsoft, und es gibt sie auch immer noch! Nix für ungut für die kleine Spitze :wink:

Nun zu den PB Makros. Erstens bin ich mal froh, dass es sowas überhaupt gibt, und zweitens gibt es Schwächen: nun ja den könnte man schon mächtig aufbohren: Macro labels, macro gotos, macro Variablen, das fiele mir aus dem Stehgreif ein. Das würde sicher nicht allzu schwierig sein, aber ich nehme mal an, da kriegt man nicht die Finger rein, oder?

Grüße

Peter
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich glaube, freak hier im deutschen und im englischen Forum ist der direkte
und bessere Ansprechpartner und könnte Dir im Bezug zu Macros viel mehr
sagen, als wir es können.

PM an freak!

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PeterJ hat geschrieben:oh, mein Verständnis über Macros ist sehr gut :lol: . Ich weiß nicht ob ich es erwähnt habe ich kommen von der IBM Z/OS Seite, und da gibt es den IBM Macro Assembler, den ich ziemlich gut beherrscht habe. Gelernt habe ich das auch nicht erst gestern sondern vor 30 Jahren! IT gab es schon lange for Microsoft, und es gibt sie auch immer noch! Nix für ungut für die kleine Spitze :wink:
/:-> warum müssen eigentlich so viele Leute ein ad hominem wahrnehmen wo keins ist?

ich sagte ausdrücklich: Verständnis für die Funktionalität von Macros in PB

also, um mal den selben Ton anzuschlagen: es ist doch völlig wurscht, woher du etwas über Macros weißt.
solange du die Macros in PB nicht selber implementiert hast, hast du keine Ahnung, wie sie umgesetzt werden,
und aus der Arbeitsweise vom IBM Macro Assembler auf die Funktionsweise der PB Macros zu schließen,
kann dich schlicht und einfach in die Irre führen.

Und wenn du Goto benutzt, kann es mit deinen Kenntnisse über Hochsprachen nicht allzu weit her sein,
also solltest du dir vielleicht wieder nen Assembler zulegen.

Hau nicht so auf die Kacke, nur weil du ebenso lange programmierst wie die meisten von uns!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Kaeru Gaman hat geschrieben: /:-> warum müssen eigentlich so viele Leute ein ad hominem wahrnehmen wo keins ist?
Warum muss ich bei dir oft bei Wikipedia nachschlagen :roll: :mrgreen:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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

Beitrag von ts-soft »

mk-soft hat geschrieben:Warum muss ich bei dir oft bei Wikipedia nachschlagen :roll: :mrgreen:
Weil Deine Bibliothek anscheinend zu klein ist :mrgreen:
Ad Hominem Arguments
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
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Beitrag von PeterJ »

Es tut mir wirklich leid, dass ich eine derartige Reaktion erzeugt hatte. Ich wollte weder mit meiner vieljährigen Erfahrung angeben noch habe ich Deine Frage als ein ad hominem empfunden. Ich wollte nur sagen: das Prinzip von Macros ist mir sehr vertraut.
Ach ja das mit den GOTOs habe ich im Kontext mit Macro Erweiterungsideen gebracht, weil dort wegen geringerer Komplexität nicht alle sonstigen Schleifenkonstrukte gebraucht werden.
Als kleines Beispiel wie ich jetzt Macros anwenden muß

Code: Alles auswählen

Macro DefAddr(ct)
    Global Dim ArrayString#ct#.s(1)
    Global Dim ArrayNumber#ct#.i(1)
    Global Dim ArrayFloat#ct#.d(1)
EndMacro
Macro DefineAddr(ct)
    DefAddr(0)  
    DefAddr(1)   
    DefAddr(2)  
    DefAddr(3)  
    DefAddr(4)   
    DefAddr(5)  
    DefAddr(6)  
    DefAddr(7)   
    DefAddr(8)  
    DefAddr(9)          
EndMacro
hier erzeuge ich zum Compilezeitpunkt 9 Sätze von String, Number und Float Arrays. Wenn ich eine GOTO und Macro Variablen hätte ging es leichter:

Code: Alles auswählen

Macro DefAddr(ct)
    %count=0                     ; compiler set, gibt es nicht
    %loop:                          ; compiler label, gibt es nicht
    %count=count+1            ; compiler arithmetik , gibt es nicht 
    CompilerIf count<=ct
      Global Dim ArrayString#ct#.s(1)
      Global Dim ArrayNumber#ct#.i(1)
      Global Dim ArrayFloat#ct#.d(1)
      CompilerGoto %loop      ; gibt es auch nicht 
    CompilerEndIf
EndMacro
das war der Zusammenhang mit dem GOTO, und nicht meine Unkenntnis von Hochsprachen.

Deine Bemerkung bezüglich des Assemblers, nehme ich jetzt einfach als überbordenden Ärger über mich hin.

Ich hatte wirklich nicht Ehrgeiz den großen Zampano zu spielen, deswegen poste ich auch ganz brav im Anfängerforum

Beste Grüße

Peter
Antworten