1 Macro, versch. Anzahl Parameter

Für allgemeine Fragen zur Programmierung mit PureBasic.
BSP
Beiträge: 203
Registriert: 01.02.2009 14:04

1 Macro, versch. Anzahl Parameter

Beitrag von BSP »

Hallo Allerseits.

Ich möchte gerne, das ein Macro eine Funktion mehrfach,
je nach Anzahl der ans Macro übergebenen Parameter,
ausführt.

In meinem Beispiel soll die Funktion "LineTo_"
so oft ausgeführt werden, wie Parameter dazu übergeben werden.

Gibt es einen Weg?
Ich hoffe, Ihr versteht anhand meines Beispielcode was ich meine.

Danke & Gruß: Bernd

Code: Alles auswählen

;-====== Macros
Macro DrawTo(vx,vy,tx,ty)
    MoveToEx_(hDC,vx,vy,0)
      LineTo_(hDC,tx,ty)
EndMacro
Macro DrawToTo(vx,vy,tx1,ty1,tx2,ty2)
    MoveToEx_(hDC,vx,vy,0)
      LineTo_(hDC,tx1,ty1)
      LineTo_(hDC,tx2,ty2)
EndMacro
Macro DrawToToTo(vx,vy,tx1,ty1,tx2,ty2,tx3,ty3)
    MoveToEx_(hDC,vx,vy,0)
      LineTo_(hDC,tx1,ty1)
      LineTo_(hDC,tx2,ty2)
      LineTo_(hDC,tx3,ty3)
EndMacro
;usw.

; Und so, z.B. sieht bisher der Aufruf aus
  Case 2
    SelectObject_(hdc, PBlack)
    DrawTo(x,y,w,h)
    DrawTo(xm,ym,w,ym)
    DrawTo(xm,ym,xm,h)
    SelectObject_(hdc, c)
    If r=0
      DrawTo(x,y,w,h)
    ElseIf r=1
      DrawToTo(x,y,xm,ym,w,ym)
    ElseIf r=2
      DrawToTo(x,y,xm,ym,xm,h)
    EndIf
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 1 Macro, versch. Anzahl Parameter

Beitrag von STARGÅTE »

richtig einfach geht sowas (beliebig viele Parameter) nicht in PB.

Anstatt mehrerer LineTo_ würde ich da lieber Polyline_ nutzen.
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
BSP
Beiträge: 203
Registriert: 01.02.2009 14:04

Re: 1 Macro, versch. Anzahl Parameter

Beitrag von BSP »

Guten morgen, Stargate.
Danke erst mal für Deine Antwort.

Ja, ich habe auch über andere Lösungen nachgedacht.
Arrays, Listen, Strings oder auch Datas.
Aber:
Je nach Aufgabe stehen eventuell andere Variablen in der Funktion.
Darum nützt es mir nichts, den Inhalt von Variablen zu übergeben.
Ich muss die Variable direkt mit der Funktion übergeben.
Wenn ich das richtig verstanden habe,
machen meine Macros das so.

Der Sinn der Übung liegt eigentlich darin,
mir etwas Programierarbeit zu sparen und besser die Übersicht zu behalten.
Naja. Mal sehen. So wirklich glücklich bin ich mit meiner Lösung noch nicht.
Das Ganze ergibt ein Symol für meinen Gleisplan- Baukasten.
In dem obigen Beispiel eine um 45 Grad gedrehte Dreiwegweiche.
Und am Ende, so meine Überlegung, soll ich die Möglichkeit haben,
weitere neue Symbole in der Art eines Addons hinzu zu fügen.
Aber weil bei mir selten etwas fest gelegt ist kann es sein,
das sich auch die Grösse der Symbole ändert.
Darum kann ich auch nicht mit festgelegten Werten arbeiten (das wäre ja auch zu einfach, Smile)
sondern die Werte errechnet erst das Programm.
Ich muss dem Programm aber sagen, unter welchen Bedingungen es welche Variablen berücksichtigen soll.
Und genau das wollte ich mir vereinfachen,
indem ich einfach nur eine veränderbare Kette an Variablen übergebe.
DrawTo(x,y,xm,ym,xm,h.........) ; auch die Variablen sollen sich ändern können, die Inhalte berechnet dann das Prg

MfG & Dank: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 1 Macro, versch. Anzahl Parameter

Beitrag von STARGÅTE »

naja, wenn du solche (ich nenne sie mal) Elemente hast, würde ich die extern z.B. in einer XML datei definieren.
Diese XML kannst du dann ganz einfach mit PB auslesen, und das Element dann anzeigen:

Code: Alles auswählen

<Gleis Name="Dreiwegweiche">
  <Line From="0,0" To="10,-4" />
  <Line From="0,0" To="10,0" />
  <Line From="0,0" To="10,4" />
</Gleis>
Das definiert erst mal die Form.
Mit mathematischen Funktionen (Matrizen) kannst du dann auf die Koordinaten Translation, Rotationen oder Skalierungen wirken lassen, wie du es im Programm anzeigen lassen willst.
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
BSP
Beiträge: 203
Registriert: 01.02.2009 14:04

Re: 1 Macro, versch. Anzahl Parameter

Beitrag von BSP »

Nochmal; Hallo Stargate.

Mein Problem bis eben:
Auch Dein Beispiel liefert ja feste Werte; Und damit konnte ich ja nichts anfangen.
Aber, und nun wirds peinlich für mich,
es werden ja schon feste Werte gebraucht.
Jedes Symbol hat ja seine festen Werte.
Ich muss Die doch nur mit einem Faktor berechnen.
xto = weite * faktor (z.B.)
So mache ich es doch in anderen Fällen auch. (Sogar schon hier im Forum).
Und so kann man die Werte dann natürlich aus einer Datei oder einer Datasection vorgeben und auslesen.

Oftmals weis man eigentlich, wie's geht.
Aber wenn man so über eine Vorgehensweise nachgrübelt passiert es schon mal,
das man sich "Verknotet" und den richtigen Weg aus den Augen verliert.
Und genau das ist mir passiert. Schähm.
Was aber vieleicht auch damit zusammenhängt,
das meine Idee von oben eventuell auch mal ganz spannend ist. (Wenn auch unsinnig).

Na ja, was soll ich noch sagen:
Nichts für Ungut und danke, das Du mich wieder "aufs richtige Gleis" gebracht hast.

Gruß & Dank: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: 1 Macro, versch. Anzahl Parameter

Beitrag von NicTheQuick »

Man könnte auch ein bisschen tricksen:

Code: Alles auswählen

Procedure LineTo_(hDc, tx, ty)
	Debug "LineTo_(hDC, " + tx + ", " + ty + ")"
EndProcedure
Procedure MoveToEx_(hDC, vx, vy)
	Debug "MoveToEx_(hDC, " + vx + ", " + vy + ")"
EndProcedure


NONE_TYPE:
Macro DrawTo(vx, vy, tx1, ty1, tx2=NONE_TYPE, ty2=NONE_TYPE, tx3=NONE_TYPE, ty3=NONE_TYPE, tx4=NONE_TYPE, ty4=NONE_TYPE)
	MoveToEx_(hDC, vx, vy)
	LineTo_(hDC,tx1,ty1)
	CompilerIf Not Defined(tx2, #PB_Label)
		LineTo_(hDC, tx2, ty2)
	CompilerEndIf
	CompilerIf Not Defined(tx3, #PB_Label)
		LineTo_(hDC, tx3, ty3)
	CompilerEndIf
	CompilerIf Not Defined(tx4, #PB_Label)
		LineTo_(hDC, tx4, ty4)
	CompilerEndIf
EndMacro

DrawTo(0, 0, 1, 1, 2, 2)
Debug "--"
DrawTo(3, 3, 4, 4)
Debug "--"
DrawTo(10, 10, 11, 11, 12, 12, 13, 13, 14, 14)
Da die Makros von Purebasic leider noch etwas leistungsschwach sind, geht es aktuell meines Wissens nicht besser. :cry:
Antworten