Variable speichern
-
Hallo zusammen!
Eigentlich ist der Titel nicht ganz passend aber ich wusste nicht wie ich das formulieren soll. Ich programmiere an einem Addon fuer den Flugsimulator, genauer ein Flugzeug samt Systemen. Es geht um folgendes: der FS benutzt den "Tick18" (vielleicht auch bekannt als DOS-Clock?), das heisst alle Callbacks werden 18x pro Sekunde aufgerufen. Ich moechte nun einen Wert nur 2x pro Sekunde auslesen und mit diesem arbeiten. Funktioniert soweit bis auf ein Problem: bei jedem Durchlauf in dem die Modulo-Operation "false" ergibt rechnet meine Funktion mit "0", was der Wert Initialwert ist. Ich moechte aber nicht mit 0 sondern mit dem Wert rechnen der jede halbe Sekunde ausgelesen wird. Eigentlich sollte das vielleicht gar nicht so schwer sein aber irgendwie stehe ich auf dem Schlauch. Bin eben noch Anfaenger

Hier mal der Code, vielleicht hat ja jemand eine Idee:
double FlyByWire::ComputedElevatorTrim() { double vs = 0; if(FlyByWire::Tick18() % 9 == 0) // wenn "false" dann wird mit 0 weitergerechnet, wie aendern? { vs = FlyByWire::VerticalSpeed(); // mit diesem Wert soll gerechnet werden } if((FlyByWire::GetPilotElevatorCommand() > -1000) && (FlyByWire::GetPilotElevatorCommand() < 1000) && ((FlyByWire::VerticalSpeed() > vs) || (FlyByWire::VerticalSpeed() < vs))) { return FlyByWire::ElevatorTrim() * 0.5; } else { return FlyByWire::ElevatorTrim(); } }Viele Gruesse
Sven
-
Dann rechne doch auch mit diesem Wert weiter
Wenn deine Bedingung "alle halbe Sekunde" erfüllt ist, landest du im ersten if-Block. Und dort muß alles rein, was du für diese Sonderbehandlung benötigst (aktuell lässt du nur den Wert 'vs' ermitteln und vergisst ihn sofort wieder).
-
Hallo CStoll,
ich glaube Du meinst das so:
double FlyByWire::ComputedElevatorTrim() { if(FlyByWire::Tick18() % 9 == 0)weitergerechnet, wie aendern? { vs = FlyByWire::VerticalSpeed(); if((FlyByWire::GetPilotElevatorCommand() > -1000) && FlyByWire::GetPilotElevatorCommand() < 1000) && ((FlyByWire::VerticalSpeed() > vs) || (FlyByWire::VerticalSpeed() < vs))) return FlyByWire::ElevatorTrim() * 0.5; } else { return FlyByWire::ElevatorTrim(); } }Das ist ja leider genau das was ich nicht moechte. Denn so wird ja der geamte Funktionsinhalt nur 2x pro Sekunde abgearbeitet. Der 2. if-Block soll ja bei jedem Durchlauf abgearbeitet werden. Habe aber einen Tip bekommen statt
double vs = 0;mal
static double vs = FlyByWire::VerticalSpeed();zu probieren.
Viele Gruesse
Sven
-
Ach so meintest du das - du willst den vs-Wert nur einmal berechnen und dann für die nächsten 9 Schleifendurchläufe verwenden. Ja, da benötigst du eine static-Variable (eine normale Variable verliert am Ende der Funktion ihre Gültigkeit und wird beim nächsten Aufruf neu initialisiert).
PS: Ich hoffe, dir ist klar, daß die Abfrage "((FlyByWire::VerticalSpeed() > vs) || (FlyByWire::VerticalSpeed() < vs))" wenig sinnvoll ist.
-
CStoll schrieb:
PS: Ich hoffe, dir ist klar, daß die Abfrage "((FlyByWire::VerticalSpeed() > vs) || (FlyByWire::VerticalSpeed() < vs))" wenig sinnvoll ist.
Ja. Es ging mir erstmal darum zu schauen ob mein Ansatz funktioniert (was er jetzt tut). Das ganze ist ja ziemlich komplex (Daten aus FS lesen, auswerten, neue Werte an FS senden). Aber diese Grundlagen funktionieren jetzt, nun kann ich mich um die richtige Umsetzung kuemmern.
P.S. So funktioniert es jetzt:
double FlyByWire::ComputedElevatorTrim() { static double vs = FlyByWire::VerticalSpeed(); if(FlyByWire::Tick18() % 9 == 0) { vs = FlyByWire::VerticalSpeed(); } if((FlyByWire::GetPilotElevatorCommand() > -1000) && (FlyByWire::GetPilotElevatorCommand() < 1000) && ((FlyByWire::VerticalSpeed() > vs) || (FlyByWire::VerticalSpeed() < vs))) { return FlyByWire::ElevatorTrim() * 0.5; } else { return FlyByWire::ElevatorTrim(); } }Viele Gruesse
Sven