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 ------
Von: "Thomas Krumbein" <Thomas.Krumbein@documentfoundation.org>
An: users@de.libreoffice.org
Gesendet: 07.12.2017 11:12:55
Betreff: Re: [de-users] LO Makro Basic Option ''Optional'' -
''IsMissing'' immer ''False''
Hallo Hans Werner,
Am 07.12.2017 um 10:29 schrieb OoOHWHOoO:
Oder habe ich Dich vielleicht völlig falsch verstanden ?
Hast Du. Versuche mal, die Texte zu lesen und nicht gleich auf deine
Anwendung/die Hilfe-Beispiele zu übertragen und Fehlinterpretationen
hinzubauen.
Du kannst keine "Kommas" weglassen - das ist weder der Sinn noch meine
Aussage.
Trenne das Ganze abstarkt:
Du übergibst beim Aufruf der Funktion dieser eine Liste mit Parametern
... die Anzahl der Parameter wird bestimmt durch die Anzahl der Trenner
+1
Also: Funktion(a,b) -> zwei Parameter, weil ein Trenner dabei ist.
Die Parameter werden nun entsprechend der physikalischen Reihenfolge
der aufrufenden Funktion übergeben.
sub Funktion( a1,b1,c1,d1) - würde zu einem Fehler führen, da die
Funktion 4 Parameter erwartet, aber nur zwei erhält.
Um den Fehler abzufangen, wird der Begriff "optional" eingeführt:
sub Funktion (a1, b1, optional c1, optional d1) - kein Fehler mehr,
zwei Parameter werden übergeben, 2-4 erwartet. Passt.
Mit isMissing() kannst Du nun c1 und d1 abfragen und eventuel neu
definieren bzw Werte zuweisen.
Der Aufruf Funktion(a,,b) übergibt 3 Parameter - zwei Trenner! Der
mittlere fehlt eben nicht! Wäre aber in dem Fall leer und führt zum
Fehler, da die Funktion eine Wert erwartet!
sub Funktion (a1, b1, optional c1, optional d1) -> a1 bekommt den Wert
von a zugewiesen, b1 bekommt den Wert von "nichts" zugewiesen, c1
bekommt den Wert von b zugewiesen, der Parameter d1 fehlt.
Das kann dir isMissing(d1) = true liefern.
Setzt Du alle Parameter auf "optional" würde das bei Basic gehen (siehe
letzte mail) - ist aber unsauber und nicht korrekt.
Korrekt wäre: sub Funktion (a1 as integer, b1 as integer, optional c1
as integer, optional d1 as integer) -> Das führt beim Aufruf
funktion(2,,3) zu dem korrekten Ergebnis:
a1 = 2, b1 = 0, c1 = 3, d1 = ?? -> missing
Das ist auch die korrekte Programmierung.
Zu Deiner Aufgabenstellung:
Du willst doch alle drei Parameter haben, oder? Lass das optionale weg
und verlagere die Prüfung vor den Aufruf. In dem Zusammenhang viel
sinnvoller. Und dann übergib immer drei Werte.
Willst Du die Prüfung unbedingt in der aufzurufenden Funktion, arbeite
mit Platzhalterwerten - z.B. -1 für "nichts".
Viele Grüße
Thomas
-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme?
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.