vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 14:08

Eine solche Berechnung mit Nullable(Of ) wo ein Wert Nothing ist liefert ohnehin Nothing. Das war der Punkt. Und mit ParamArray kannst du eine beliebige Anzahl von Parametern übergeben, und wie ein Array ansprechen.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 12:36

hallo,

ich möchte innerhalb einer function die Übergabeparameter überprüfen und zwar ohne die Parameter kennen zu müssen. Der Hintergrund ist folgender: Ich habe mehrere Berechnungsfunktionen, die mehrere Parameter vom Typ Nullable(Of Double) übergeben bekommen. Der Typ Nullable(Of Double) kann den Wert nothing annehmen, weshalb ich ihn auch verwende. Das hat allerdings zur Folge, das Übergabeparameter mit dem Wert nothing Berechnungen unmöglich machen. Deswegen benötige ich einen möglichst flexiblen Mechanismus, der überprüft ob alle Übergabeparameter einen Wert haben.

Eine Möglichkeit wäre es, exceptions mit try catch abzufangen. Aber wenn ich das so mache, unterbricht der Debugger ständig um mich über die exceptions zu informieren.

Deswegen wäre eine Lösung mit reflection oder etwas ähnliches besser.

Public Function Calculate(ByVal a As Nullable(Of Double), ByVal b As Nullable( _
  Of Double), ByVal c As Nullable(Of Double)) As Nullable(Of Double)
    'überprüfen der parameter hier:
 
    Return (a + b) / c
  End Function
gruß Maurice
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 12:49

Hallo!

Frage die Parameter auf "HasValue" ab.
Falls mindestens einer der Parameter dabei "false" liefert,
beendest Du die Funktion und gibst Nothing zurück.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 13:15

Und warum übergibst du nullable Werte wenn die Werte nicht Null sein dürfen? Oder du prüfst einfach den Rückgabewert und weißt ob ein Parameter Nothing war. Logisch macht das sonst keinen Sinn.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 13:43

Die Übergabewerte dürfen nothing sein, um zu signalisieren ob eine Variable durch Nutzereingabe schon gesetzt wurde oder nicht. Wenn einer der Übergabewerte nicht gesetzt wurde, soll die function nothing zurückgeben.

@Manfred X:
Das man mit HasValue den Zustand abfragt, weiß ich bereits. Das Problem ist eigenlich, das ich eine Auflistung aller Übergabewerte brauche, die ich dann in einer Schleife durchlaufen kann um HasValue abzuprüfen.

Ich habe etwa 50 derartige Berechnungsfunktionen mit verschiedenen Übergabewerten, deswegen bin ich auf der Suche nach einer flexiblen Möglichkeit ein variable Anzahl an Parametern auf Hasvalue zu prüfen. Ich hatte dabei schon an Reflection gedacht.

system.reflection.methodinfo könnte eine Möglichkeit sein, allerdings habe ich bisher noch keine Möglichkeit gefunden, damit direkt auf die Übergabeparameter meiner Funktion zuzugreifen.

Beitrag wurde zuletzt am 21.09.11 um 13:44:43 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 14:26

Hallo!

Suchst Du eine in allen Routinen einsetzbare Check-Funktion?
Private Function CheckParameters _
    (ByVal ParamArray args() As Nullable(Of Double)) As Boolean
 
    For i As Integer = 0 To args.Length - 1
       If Not args(i).HasValue Then Return False
    Next i
    Return True
End Function
Bei Berechnungen hat jeder Parameter eine spezifische Funktion.
Vorhandensein und Ausprägung sollte deshalb individuell beurteilt werden.

Beitrag wurde zuletzt am 21.09.11 um 14:29:02 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 14:38

Warum so kompliziert?
Return Array.TrueForAll(Of Nullable(Of Double))(args, Function(x) x.HasValue)

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 14:47

Hallo!

... wegen der ergänzenden Anmerkung
(z.B. Einbau zusätzlicher Überprüfung der Parameter auf Ausprägungsbereich
bzw. auf das Vorliegen von Double.NaN).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 15:00

Naja, mein Humor ist wieder an dir vorbeigegangen. Aber zusätzliche Prüfungen haben nichts mit der Schleife zu tun.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 17:21

Vielen Dank ihr beiden! So lässt sich das gut lösen. Perfekt wäre es, wenn ich auch noch alle Übergabewerte meiner Functions mittels Reflection ermitteln könnte.

Aber das schaue ich mir mal an, wenn ich ein bisschen Zeit finde um mich mit Reflection intensiver auseinanderzusetzen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 18:22

Erstens ist Reflection extrem langsam und bei Berechnungen ist Geschwindigkeit oft ein Thema, zweitens musst du in einer Methode die Werte gar nicht "abfragen", die sind ja als Parameter direkt verfügbar. Oder du erklärst was Sinn der Sache ist, ist mir immerhin gar nicht klar. Naja, falls du noch welchen Rat begrüßen würdest.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 18:36

Hallo!

... und ergänzend:
Du kannst über Reflection den aktuellen Wert einer
Eigenschaft/eines Feldes bei Objekt-Instanzen ermitteln.

Funktions-Parameter besitzen aber keinen "Wert", den man
abfragen könnte, ehe die Funktion tatsächlich aufgerufen
wird (abgesehen von einem möglichen Default-Wert).

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 18:51

Der Sinn ist, dass ich mir den Aufwand sparen will für ca. 100 Functions mit je bis zu 10 Übergabeparametern eine individuelle Überprüfung von HasValue zu schreiben.

Im Moment müsste ich zwar nur folgenden Code-Block an den Anfang jeder Function kopieren, aber die Übergabeparameter für CheckParameters muss ich für jede Function trotzdem individuell anpassen, was sehr mühsam ist bei bis zu 10 Übergabeparametern:

   If CheckParameters(a,b,c) = False Then
      Return Nothing
      Exit Function
    End If
Wenn die Performance durch Reflection stark leidet, sollte ich mir vielleicht lieber ein kleines Skript schreiben, was mir die Übergabewerte aus dem Quellcode direkt extrahiert. Damit könnte ich mir den Code-Block für jede Function individuell erzeugen lassen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 18:55

Hallo!

Warum willst Du die Parameter IN JEDER Funktion überprüfen?
Check doch vor der Durchführung der Berechnungen
das Vorhandensein der erforderlichen Werte.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 19:21

Hallo Manfred,

ich schreibe ein Programm für maschinenbautechnische Berechnungen. Das Problem ist, viele Parameter können eine Eingabe vom Nutzer sein, oder auch ein Ergebnis der Berechnung. D.h. nach jeder Eingabe des Nutzers wird automatisch die komplette Berechnung ausgelöst, wobei die Reihenfolge der Funktionsaufrufe teileweise von der zuletzt durch den Nutzer geänderten Variable abhängt. Dadurch kann es vorkommen, dass einzelne Werte noch nicht gesetzt sind.

Ein globale Analyse aller Eingabekonstellation wäre für meinem Anwendungsfall viel zu komplex und fehleranfällig. Deswegen ist es einfacher, aus den Funktionsaufrufen als Ergebnis nothing zurückzubekommen, wenn eine Berechnung nicht möglich ist. In meinem Functions wird häufig auf Funktionen aus System.math zugegriffen, und die mögen es leider nicht mit nothing "gefüttert" zu werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 19:44

Hallo!

Und was hälst Du von strukturierter Fehlerbehandlung,
also einem Try-Catch-Finally-Konstrukt um den gesamten
Berechnungsblock?

Wie verarbeitest Du, dass der Double-Datentyp beim
Auftreten von "OverFlow" und "DivisionByZero" in den
Berechnungen keine Ausnahmen auslöst?
Die Analyse der Rückgabe (auf NaN, Infinity) liefert hier
keine zuverlässige Information.

Meines Erachtens solltest Du vor den Berechnungen die
verwendeten Werte (insbesondere User-Inputs) überprüfen.

MfG
Manfred

Beitrag wurde zuletzt am 21.09.11 um 19:47:02 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 21.09.11 20:51

Hallo Manfred,

ich setze try catch bereits ein, was bei der fertig kompilierten Software auch alle Probleme löst. Nur leider Informiert mich der Debugger von Visual Studio während der Entwicklung jedesmal wenn eine exception durch nicht gesetzte Werte auftritt, auch wenn dies durch try catch abgefangen wird. Und das ist eigentlich das Problem, was ich lösen möchte. Ich könnte den Debugger zwar auch deaktivieren, aber dadurch entgehen mir dann möglichweise auch exceptions von Interesse.

Solange alle Rechenoperationen nur mit dem Typ Nullable(Of Double)) ablaufen, gibt es keine Probleme. Wie bereits geschrieben, gibt es erst Probleme wenn ich z.B. auf Funktionen von system.math zugreife, da diese nur double entgegennehmen.

Deswegen bin ich jetzt auf die eigentlich naheliegende Idee gekommen, die Funktionen die ich aus system.math verwende zu kapseln. z.B. so


Private Function sin(ByVal Value As Nullable(Of Double)) As Nullable(Of Double)
    If Value.HasValue = True Then
      Try
        Return Math.Sin(Value)
      Catch ex As Exception
        Return Nothing
      End Try
    Else
      Return Nothing
    End If
  End Function
Gruß
Maurice
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Manfred X
Datum: 21.09.11 21:10

Hallo!

Ich würde anders vorgehen.

Erstelle eine Klasse "DoubleEx", die die privaten Member
_Value (Double), _HasValue (Boolean),
_MinValue (Double), _MaxValue (Double) enthält.

Im Konstruktor wird per MinValue-,MaxValue-Parameter angegeben,
was der zulässige Wertebereich dieser Klasseninstanz ist.

Im Set der Property für _Value wird geprüft, ob der zugewiesene
Wert in diesem Intervall liegt (auch Check auf IEEE-Sonderwerte)
und ggf. wird eine Exception geworfen.
Bei erfolgreicher Zuweisung wird _HasValue true.

Im Get wird geprüft, ob ein Wert vorliegt und - falls nicht -
die Exception geworfen.

Bei strukturierter Fehlerbehandlung kannst Du festlegen, welche
Exceptions aufgefangen (übergangen) werden und welche nicht
(z.B. während der Testphase des Programms). Für die DoubleEx-Klasse
kannst Du spezifische Exceptions erstellen.

MfG
Manfred

Beitrag wurde zuletzt am 21.09.11 um 21:11:05 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 21:46

Du kannst im Debug Menu unter Exceptions die Option etwa "Wenn die Ausnahme ausgelöst wird" ausschalten. Aber das Benehmen des Debuggers sollte nicht beeinflussen welchen Code du schreibst.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Übergabeparameter einer Function abfragen 
Autor: Maurice
Datum: 22.09.11 16:14

Hallo Manfred,

Nullable(Of Double) bringt schon alles mit was ich benötige.

Ich habe jetzt, wie vorher bereits beschrieben, alle Funktionen aus system.math die ich benutze nocheinmal gekapselt. Dadurch treten jetzt auch keine Exceptions mehr auf. ...Und der Änderungsaufwand für den bestehenden Code war minimal.

gruß Maurice
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel