Variable kann nicht gesetzt werden,

  • VB.NET

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

    Variable kann nicht gesetzt werden,

    Hallo,
    nach längerer Inaktivität habe ich nun doch wieder angefangen Problem mit Visual Basic zu lösen. Folgendes hat sich nun ergeben:

    In einem selbst erstellten Control wird mit einem Timer eine Funktion ausgeführt, die prozedual verschiedene Schritte bearbeitet und unter anderem die Variable Aktuelle Position eines Aufzuges im Schacht verändert. Der Zugriff auf alle in der Klasse deklarierten Variablen erfolgt ohne Probleme.

    Jetzt wird mit jedem Timer Tick ein weiterer Sub aufgerufen, der die aktuelle Etage (in Double umgerechnet mit Nachkommastellen) auf Ganzzahligkeit überprüft. Ist diese Zahl ein natürliche Zahl wird ein Event ausgelöst EtageErreicht().

    Jetzt wird ein neuer Sub aufgerufen über Handles der das Event verarbeiten soll. In diesem Sub ist es möglich jegliche Variablen einzulesen und beispielsweise per MsgBox auszugeben.

    Es ist jedoch nicht möglich in eine Vorher definierte Variable

    Quellcode

    1. Public EntprellungsvariableAktuelleEtage As Double
    zu schreiben.

    Wird durch den Timer und Event Verschachtelung innerhalb des Controls ein neuer Thread aufgemacht, der keinen Zugriff auf die Variablen hat womit ich den sender im Event übergeben muss, oder hat es andere unerklärliche Gründe?

    Liebe Grüße
    Tobias
    Wieso ist die Variable öffentlich? Das verstößt gegen objektorientierte Programmierung.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    tobikubi schrieb:

    die aktuelle Etage (in Double umgerechnet mit Nachkommastellen) auf Ganzzahligkeit überprüft.
    Allein dies ist nicht trivial, Du musst den Wert auf einem "Epsilon"-Bereich testen, der dann als Ganzzahl interpretiert wird:

    VB.NET-Quellcode

    1. Dim GANZZAHL = 3D
    2. Dim value = 3.11
    3. Const Epsilon = 0.1
    4. If value + Epsilon > GANZZAHL AndAlso value - Epsilon < GANZZAHL Then
    5. MessageBox.Show("drinne")
    6. Else
    7. MessageBox.Show("draußne")
    8. End If
    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!
    Danke für den Hinweis mit der Epsilon Umgebung. Soweit habe ich leider nicht gedacht, da mich die Zugriffe mit den Variablen so langsam nerven.

    Die Deklaration erfolgt normal (natürlich als Private, und strikt nach den Regeln der oop)

    Quellcode

    1. Private AktuelleEtage As Double
    2. Private EntprellungsvariableAktuelleEtage As Double

    In einem separaten Sub wird die Epsilon Umgebung entprellt, da bei ausreichend kleinen Schrittweiten, bzw. Timerintervallen, der Aufzug sich mit einer Auflösung bewegen kann die unter die Schrittweite der Umgebung fällt, womit eine mehrfach Erkennung des Etagendurchgangs anfallen würde.

    Quellcode

    1. Private Sub EtageErreicht_Sub()
    2. If AktuelleEtage <> EntprellungsvariableAktuelleEtage Then
    3. 'Wird erreicht wenn eine Etage erreicht wird ohne Prellen
    4. End If
    5. EntprellungsvariableAktuelleEtage = AktuelleEtage
    6. End Sub


    Das Problem was auftritt ist folgendes: Die letzte Zeile Code wird nicht ausgeführt bzw. nicht richtig interpretiert. Ergo: Die Variable EntprellungsvariableAktuelleEtage wird nicht mit der Aktuellen Etage gefüllt sonder bleibt auf dem initialisierten Wert stehen.

    Meine Befürchtung bleibt, dass durch den Aufruf des Timers ein Aufruf außerhalb des Threads gemacht wird und somit die Variablen ByVal aufgerufen werden. Ein lesen und Vergleichen ist somit möglich nur kein Schreiben. Das Problem entzieht sich jedenfalls meinen Kenntnissen der Umgebung

    Liebe Grüße
    Tobias

    tobikubi schrieb:

    Die letzte Zeile Code wird nicht ausgeführt bzw. nicht richtig interpretiert.
    Setze da einen Haltepunkt rein und führe das Program schrittweise aus, gugst Du hier.
    Kann es sein, dass Du Werte in 2 verschiedenen Einheiten miteinander vergleichst?
    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!
    Die Überwachung hat, fünffach ausgeführt, das bestätigt was ich durchgehend beobachtet habe.

    Quellcode

    1. EntprellungsvariableAktuelleEtage = AktuelleEtage


    Diese Zuweisung wird nicht ausgeführt. Wenn die Entprellungsvariable den Wert 4 hat und dort EntprellungsvariableAktuelleEtage = 5 gesetzt wird hat die Entprellungsvariable im nächsten Schritt und Durchgang weiterhin den Wert 4

    tobikubi schrieb:

    Diese Zuweisung wird nicht ausgeführt.
    Ja und?
    Dein Satz klingt sehr interessant, jedoch sehe ich nicht den Code, der dessen Inhalt implementiert.
    Poste bitte mal den relevanten Code.
    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!
    Den relevanten Code habe ich gepostet.

    Folgende Aufruf Hirarchie:

    Timer:

    Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. If Sicherheitscheck() = False Then Exit Sub 'Überprüfung ob der Aufzug Fahren darf
    3. Dim neuePosition As Double
    4. If MotorRichtung = Aufwaerts Then
    5. neuePosition = PositionImSchacht + MotorGeschwindigkeit / (1000 / Timer1.Interval)
    6. If neuePosition > (Schachthoehe - AufzugHoehe) Then
    7. neuePosition = Schachthoehe - AufzugHoehe
    8. PositionImSchacht = neuePosition
    9. StopMotor()
    10. Else
    11. PositionImSchacht = neuePosition
    12. End If
    13. End If
    14. If MotorRichtung = Abwaerts Then
    15. neuePosition = PositionImSchacht - MotorGeschwindigkeit / (1000 / Timer1.Interval)
    16. If neuePosition < HoeheErsteEtage Then
    17. neuePosition = HoeheErsteEtage
    18. PositionImSchacht = neuePosition
    19. StopMotor()
    20. Else
    21. PositionImSchacht = neuePosition
    22. End If
    23. End If
    24. BerechneVirtuellePosition()
    25. Label1.Text = VirtuellePosition
    26. Me.AufzugVisualisierung.Refresh()
    27. End Sub


    BerechneVirtuellePosition:

    Quellcode

    1. Private Sub BerechneVirtuellePosition()
    2. VirtuellePosition = PositionImSchacht / AufzugHoehe + 1
    3. Dim DifferenzZuEtage As Double = VirtuellePosition Mod 1
    4. If DifferenzZuEtage < 0.05 Then
    5. AktuelleEtage = VirtuellePosition - DifferenzZuEtage
    6. EtageErreicht_Sub()
    7. End If
    8. End Sub


    EtageErreicht

    Quellcode

    1. Private Sub EtageErreicht_Sub()
    2. If AktuelleEtage <> EntprellungsvariableAktuelleEtage Then
    3. End If
    4. EntprellungsvariableAktuelleEtage = AktuelleEtage 'Wenn hier zugewiesen wirdEnd Sub


    Das ganze noch ohne Epsilon Umgebung

    tobikubi schrieb:

    VB.NET-Quellcode

    1. VirtuellePosition = PositionImSchacht / AufzugHoehe + 1
    2. Dim DifferenzZuEtage As Double = VirtuellePosition Mod 1
    Mod hat Integer als Ergebnis.
    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!
    Die Funktion wird Ordnungsgemäß aufgerufen. Das Einzige was nicht funktioniert ist EntprellungsvariableAktuelleEtage = AktuelleEtage

    Die Entprellungsvariable nimmt NICHT den Wert an der AktuelleEtage hat.

    Wenn AktuelleEtage = 5 ist und EntprellungsvariableAktuelleEtage = 4 ist nach ausführen von EntprellungsvariableAktuelleEtage = AktuelleEtage EntprellungsvariableAktuelleEtage weiterhin 4

    tobikubi schrieb:

    weiterhin 4
    Mod ist ein Integer-Operator.
    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!
    Komischerweise wurden die richtigen Variablenwerte weitergegeben. Das ganze habe ich auch inzwischen korrigiert und es kommen weiterhin die Richtigen Variablen Werte im EtageErreicht_Sub() An. Ergo Habe ich wie oft erwähnt per Breakpoint analyes herausgefunden, dass die Variablen die oben genannten werte haben.

    tobikubi schrieb:

    Ergo
    hast Du nun keine Problenme mehr.
    Oder doch?
    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!