Wert von Boolean-Variable wir scheinbar nicht geändert

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wert von Boolean-Variable wir scheinbar nicht geändert

    Hallo :)

    Ich sitze grade an einem kleinen aber wichtigen Detail, und ich verstehe nicht wo der Fehler liegt, egal wie lang ich es mir anschaue. Ich prüfe mit meinem Installer, welche Version(en) (32 oder 64 Bit) von meinem Programmm installiert sind. Die Variablennamen sind denke ich selbsterklärend:

    VB.NET-Quellcode

    1. ...
    2. ElseIf App32IsInstalled Xor App64IsInstalled Then
    3. Aktion.Add("Installation")
    4. Dim AddUpdateString32 As Boolean = False
    5. Dim AddUpdateString64 As Boolean = False
    6. If App32IsInstalled Then
    7. If Is32BitNewestVersion Then AddUpdateString32 = True
    8. End If
    9. If App64IsInstalled Then
    10. If Is64BitNewestVersion Then AddUpdateString64 = True
    11. End If
    12. If (Not AddUpdateString32) Or (Not AddUpdateString64) Then Aktion.Add("Update")
    13. ...


    Es soll in einer ComboBox das Item "Update" erscheinen, wenn AddUpdateString32 oder AddUpdateString64 = True ist.

    Die ComboBox ist an Aktion gebunden.

    Soweit so gut.

    Nun erhalte ich aber in Zeile 17 für beide Variablen (also AddUpadteString32 und AddUpdateString64 den Wert False und ich kann mir absolut nicht erklären warum, denn ich bin das Ganze mit dem Debugger Zeile um Zeile durchgesteppt, und der Wert von AddUpdate32 wird in Zeile 10 definitiv auf True gesetzt.

    Weiss jemand was da los sein könnte?
    Ja genau da ist ein Not jeweils davor. Man kann ja über AppUpdateString32 und über dem Not davor mit der Maus hovern und bekommt dann logischerweise invertierte Werte angezeigt. Wenn ich aber über AppUpdateString32 hovere, also nicht auf das Not davor, dann wird mir False angezeigt komischerweise...
    @kafffee Setze einen Haltepunkt auf Zeile 9, füge beide Variablen dem Überwachungsfenster hinzu und steppe durch Deine Anwendung.
    Debuggen, Fehler finden und beseitigen
    Und:
    Deine Anwendung kann entweder als 32 Bit- oder als 64 Bit-App laufen.
    Was soll Deine Unterscheidung bewirken?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Unterschied Or/OrElse

    Deine Prüfung lässt sich deutlich verkürzen, dann sieht man auch leichter durch.

    VB.NET-Quellcode

    1. ...
    2. ElseIf App32IsInstalled Xor App64IsInstalled Then
    3. Aktion.Add("Installation")
    4. Dim AddUpdateString32 = Not (App32IsInstalled AndAlso Is32BitNewestVersion)
    5. Dim AddUpdateString64 = Not (App64IsInstalled AndAlso Is64BitNewestVersion)
    6. If AddUpdateString32 OrElse AddUpdateString64 Then Aktion.Add("Update")
    vermutlich noch mehr, das xOr ist auch verdächtig

    Haudruferzappeltnoch schrieb:

    das xOr ist auch verdächtig
    Isses nicht, ein Programm kann entweder x86 oder x64 sein, also True.False OrElse False.True, das ist XOr.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    kafffee schrieb:

    Ja genau da ist ein Not jeweils davor.


    Ok und was ist jetzt richtig? Dein Code stimmt ja nicht mit deinem Text überein. Du sagst:

    kafffee schrieb:

    Es soll in einer ComboBox das Item "Update" erscheinen, wenn AddUpdateString32 oder AddUpdateString64 = True ist.

    Im Code steht aber: If (Not AddUpdateString32) Or (Not AddUpdateString64) Then Aktion.Add("Update") was soviel heißt wie, wenn einer der beiden False ist, dann wird Update hinzugefügt.
    Ich frage mich: Was soll AddUpdateString aussagen? Warum wird die Variable auf True gesetzt, wenn Is32BitNewestVersion auch True ist?
    Bedeutet es: Wenn die 32-Bit-Variante die neueste ist ( @kafffee: Ich glaube, dass das richtige Word da eher »Latest« ist, nicht »Newest«), dass dann mit AddUpdateString auf True später irgendwo ein Text erfolgt: Ist auf neuestem Stand? Und dementsprechend: Wenn es nicht auf dem neuesten Stand ist, soll dann die ComboBox eine Update-Funktion auswählen/anbieten?

    Schlussfolgerung:

    kafffee schrieb:

    Die Variablennamen sind denke ich selbsterklärend
    Ich kann nicht zustimmen.

    Aber zum Hauptproblem: In Zeile#10 wird AddUpdateString32 auf True gesetzt und in Zeile#17 ist es nicht mehr auf True, hab ich das richtig verstanden?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Wenn "Update" nicht hinzugefügt wird, dann sei 32 und 64 installiert und auf neuestem Stand.
    Aber das wird doch schon durch die Anfangsbedingung ausgeschlossen: ElseIf App32IsInstalled Xor App64IsInstalled Then = entweder, oder

    ##########

    Ich hab mir mal die Aussagenlogik angepasst und damit versucht rauszufinden, was das Programm sagen will:

    VB.NET-Quellcode

    1. Dim Foo32 = True
    2. Dim Foo64 = True
    3. If App32IsInstalled AndAlso Is32BitNewestVersion Then Foo32 = False
    4. If App64IsInstalled AndAlso Is64BitNewestVersion Then Foo64 = False
    5. If Foo32 OrElse Foo64 Then Aktion.Add("Update")

    Ich habe nun überlegt, was Foo32 und Foo64 für eine Bedeutung haben, aber solange mir nicht klar ist, welche Konsequenzen für den Benutzer das Hinzufügen von Update zur ComboBox hat, ist das Spekulatiusbacken.
    Wenn es bedeutet, dass es Updates gibt, dann steht Foo also für installierte Version ist nicht auf dem neuesten Stand. Aber wozu dann so kompliziert, @kafffee?

    VB.NET-Quellcode

    1. If App32IsInstalled AndAlso Not Is32BitNewestVersion Orelse App64IsInstalled AndAlso Not Is64BitNewestVersion Then Aktion.Add("Update")


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Wow erstmal danke für die rege Teilnahme :)

    Einmal eine Nacht drüber geschlafen und hab den Fehler auf Anhieb gefunden. Mit den meisten eurer Posts konnte ich im Nachzug auch was anfangen, stimmt schon das geht auch einfacher...:

    Da konnte ich natürlich lange den Fehler suchen, wenn...

    (1) Is32BitNewestVersion = False ist
    (2) Das Not davor fehlt
    (3) Wenn ich die Variablen hier zu Unrecht invertiert sind : If (Not AddUpdateString32) Or (Not AddUpdateString64) Then Aktion.Add("Update")

    Korrekt ist also das hier:

    VB.NET-Quellcode

    1. ...
    2. ElseIf App32IsInstalled Xor App64IsInstalled Then
    3. Aktion.Add("Installation")
    4. Dim AddUpdateString32 As Boolean = False
    5. Dim AddUpdateString64 As Boolean = False
    6. If App32IsInstalled Then
    7. If Not Is32BitNewestVersion Then AddUpdateString32 = True
    8. End If
    9. If App64IsInstalled Then
    10. If Not Is64BitNewestVersion Then AddUpdateString64 = True
    11. End If
    12. If AddUpdateString32 Or AddUpdateString64 Then Aktion.Add("Update")
    13. ...


    Und hier hatte ich abseits noch diesen Fehler, da hatte ich statt den >= nur ein > stehen

    VB.NET-Quellcode

    1. Public Sub CheckIfNewestVersion()
    2. If Not currentVersion32 = "?" Then
    3. If New Version(currentVersion32) >= New Version(VersionsInfo32.version) Then
    4. Is32BitNewestVersion = True
    5. End If
    6. Else
    7. Is32BitNewestVersion = False
    8. End If
    9. If Not currentVersion64 = "?" Then
    10. If New Version(currentVersion64) >= New Version(VersionsInfo64.version) Then
    11. Is64BitNewestVersion = True
    12. End If
    13. Else
    14. Is64BitNewestVersion = False
    15. End If
    16. End Sub
    hmm - statt

    VB.NET-Quellcode

    1. ElseIf App32IsInstalled Xor App64IsInstalled Then
    2. Dim AddUpdateString32 As Boolean = False
    3. Dim AddUpdateString64 As Boolean = False
    4. If App32IsInstalled Then
    5. If Not Is32BitNewestVersion Then AddUpdateString32 = True
    6. End If
    7. If App64IsInstalled Then
    8. If Not Is64BitNewestVersion Then AddUpdateString64 = True
    9. End If
    10. ...
    scheint mir folgendes doch deutlich lesbarer:

    VB.NET-Quellcode

    1. ElseIf App32IsInstalled Xor App64IsInstalled Then
    2. Dim AddUpdateString32 = App32IsInstalled AndAlso Not Is32BitNewestVersion
    3. Dim AddUpdateString64 = Not AddUpdateString32 AndAlso Not Is64BitNewestVersion
    4. ...
    Benamungs-Vorschlag:

    VB.NET-Quellcode

    1. ElseIf App32IsInstalled Xor App64IsInstalled Then
    2. Dim Update32Required = App32IsInstalled AndAlso Not Is32BitNewestVersion
    3. Dim Update64Required = Not Update32Required AndAlso Not Is64BitNewestVersion
    4. ...

    AddUpdateString<XX> - so benennt man eine Methode, aber keine bool-Variable

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades

    yep wie gesagt, ich gebe zu, das geht auch einfacher als meins :)

    RodFromGermany schrieb:

    Deine Anwendung kann entweder als 32 Bit- oder als 64 Bit-App laufen.
    Was soll Deine Unterscheidung bewirken?

    Das Programm arbeitet mit VST2-Plugins. Die laufen entweder auf 32 oder auf 64 Bit, aber nicht auf beiden, leider. Bin mal gespannt ob und wann Un4Seen seine bassvst.dll mit VST3-Unterstützung implementiert :) das wär mal was :)

    kafffee schrieb:

    Das Programm arbeitet mit VST2-Plugins.
    Das ist bei nativen DLLs der Normalzustand.
    Bei meinen Kamera-Anwendungen entwickle ich getrennt für x86 und x64, das ist leider erforderlich, da sich unter x64 mit UserContgrols der Designer nicht öffnen lässt.
    Da musst Du die DLLs getrennt nach x86 und x64 in entsprechende Verzeichnisse packen und im PostBuildStep die dichtigen DLLs in das Zielverzeichnis kopieren.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!