Hallo Thomas,
da habe ich wohl Deine gestrige Aussage (Wed, 6 Dec 2017 23:35:03 +0100) missverstanden:
"[…] Das Modell sah nie vor, mittlere Parameter auszulassen - also so etwas wie bei Dir: "Called_3(A,C)" - dass das überhaupt funktioniert hat mich sowieso gewundert. […] Der typische Aufruf sähe also aus: Called_3(A,C) […]".
Das hatte ich als "Komma weglassen" verstanden, aber Du wolltest mir darstellen, dass so eine Schnittstelle-Definition "Sub Called_3(Optional A as Integer,Optional B,Optional C as Integer)" verbunden mit dem Aufruf "Called_3(A,C)" programmiertechnisch "unsauber" ist und es Dich wunderte, dass es überhaupt funktionierte. Und dann haben wir wohl etwas aneinander vorbei argumentiert, weil wir unterschiedliche Problem-Schwerpunkte sahen …
Ich denke, ich habe jetzt verstanden, worauf Du hinaus wolltest. Zur Gegenkontrolle zusammengefasst mit meinen Worten.
[1] Test-Makros
Sub Calling
Dim A,B,C,D,E as Integer
A=1 : B=2 : C=3 : D=4 : E=5
Called (A,B,C,D,E)
End Sub
Sub Called (A as Integer,Optional B as Integer,Optional C as Integer,Optional D as Integer,Optional E as Integer)
MsgBox("IsMissing(B): " & IsMissing(B) & Chr(13) &_
"IsMissing(C): " & IsMissing(C) & Chr(13) &_
"IsMissing(D): " & IsMissing(D) & Chr(13) &_
"IsMissing(E): " & IsMissing(E) & Chr(13)
End Sub
[2] Programmiertechnisch "sauber" definierte Schnittstelle (vgl. "Sub Called"):
+ Zuerst alle "nicht optionalen" Parameter, dann alle "optionalen" Parameter !
[3] "IsMissing" liefert nur korrekte Ergebnisse, wenn die Parameter auch wirklich im Aufruf der Schnittstelle fehlen:
[3.1] Beispiel: Called(A,B)
IsMissing(B): False
IsMissing(C): True
IsMissing(D): True
IsMissing(E): True
"C", "D" und "E" werden durch "IsMissing" erfasst.
[3.2] Beispiel: Called(A,B,)
IsMissing(B): False
IsMissing(C): True
IsMissing(D): True
IsMissing(E): True
"D" und "E" werden durch "IsMissing" erfasst. Und auch "C" - trotz des Platzhalter-Kommas ! LO-BASIC hält sich hier offensichtlich nicht an die Regel: "Anzahl der Parameter" ist gleich "Anzahl der Trenner" + 1.
[3.3] Beispiel: Called(A,B,D)
IsMissing(B): False
IsMissing(C): False
IsMissing(D): False
IsMissing(E): True
"E" wird durch "IsMissing" erfasst, "C" jedoch nicht, weil nicht wirklich fehlt wegen dem ","-Plathalter.
[4] Nicht durch "IsMissing" erfasste, aber dennoch "fehlende" Parameter, muss man durch Platzhalterwerte kennzeichnen.
[5] Test-Makros (modifiziert)
Sub Calling_MOD
Dim A,B,C,D,E as Integer
A=1 : B=2 : C=3 : D=4 : E=5
Called_MOD (A,B,C,D,E)
End Sub
Sub Called_MOD (A as Integer,Optional B as Variant,Optional C as Variant,Optional D as Variant,Optional E as Variant)
Dim ZK as String
MsgBox("IsMissing(B): " & IsMissing(B) & Chr(13) &_
"IsMissing(C): " & IsMissing(C) & Chr(13) &_
"IsMissing(D): " & IsMissing(D) & Chr(13) &_
"IsMissing(E): " & IsMissing(E) & Chr(13)
Z = "A=" & A & Chr(13)
If (Not IsMissing(B)) Then : If (B <> "!B") Then : Z = Z & "B=" & B & Chr(13) : End If : End If
If (Not IsMissing(C)) Then : If (C <> "!C") Then : Z = Z & "C=" & C & Chr(13) : End If : End If
If (Not IsMissing(D)) Then : If (D <> "!D") Then : Z = Z & "D=" & D & Chr(13) : End If : End If
If (Not IsMissing(E)) Then : If (E <> "!E") Then : Z = Z & "E=" & E & Chr(13) : End If : End If
MsgBox (Z)
End Sub
[5.1] Setzt man (beispielsweise) für die optionalen Parameter (in "Sub Called") den Typ "Variant", kann man mit einheitlichen Platzhalterwerten für "fehlenden Parameter" arbeiten, beispielsweise für den Parameter "C" mit "!C" für "!parametername". "!" ist in Perl das Zeichen für logisch "NICHT".
[5.2] "Called_MOD(A,B,"!C",D)" liefert
IsMissing(B): False
IsMissing(C): False
IsMissing(D): False
IsMissing(E): True
A=1
B=2
D=4
[6] Persönliche Schlussfolgerungen
[6.1] "Optional" und "IsMissing" sollte man nur nutzen, wenn die betroffenen Parameter bei jeglicher Aufruf-Situation entweder vorhanden sind oder WIRKLICH wegfallen und nicht durch "," "überleben", da man sonst "doppelt prüfen" muss.
[6.2] In allen anderen Fällen ist es sinnvoller, gleich mit "ist nicht vorhanden"-Platzhalterwerten zu arbeiten.
[7] Meine Anwendung
Die Anwendung ist eine für verschiedene SUBs formulierte Test-Anzeige-Routine für Testzwecke, die, aufgerufen in verschiedenen SUBs (eines Projektes), dann immer nur das anzeigt, was in der jeweiligen SUB nach Durchführung der Verarbeitung an verarbeiteten Daten zur Verfügung steht. So "müllt" man sich die SUBs nicht mit Anweisungen für Test-Anzeigen zu, sondern benötigt nur eine Anweisungszeile ...
Nochmals Dank für Deine Geduld und hilfreichen Ausführungen,
Grüße
Hans-Werner :-))
------ Originalnachricht ------