Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


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.