C++ if-Bedienung

Gast #4830782
Guten Mittag liebe Leute.

Ich habe ein Tastenfeld 4x4 sowie einen STM32F407 Mikrocontroller, 
welcher über Eclipse in c++ programmiert wird.

Nun habe ich eine if-Bediegnung erstellt, welche abfragt in welcher 
Reihenfolge die Taster gedrückt wurde (in diesem Fall zuerst 1 danach 
2).
Wenn nur zwei Bedienungen wahr sein müssen funktioniert dies perfekt
1
if((var_tast1 == 2) && (var_tast2 == 1))

Sobal die if-Bedingung jedoch mehr als 2 Variabeln abfragen muss, wird 
die if-Bedienung nie ausgeführt.

1
if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))

Könnte mir jemand helfen woran, dass dies liegt?

PS: Mein Code befindet sich im Anhang
Angehängte Dateien:
Gast
laurentdm schrieb:
> Sobal die if-Bedingung jedoch mehr als 2 Variabeln abfragen muss, wird
> die if-Bedienung nie ausgeführt.
>
> if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))

doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3 
nicht das drin was du erwartest.
Welchen Wert die Variablen haben, wenn 'var_taste == 0' überblicke ich 
gerade nicht. Wenn 'var_taste > 0' und damit die Verschiebung der Werte 
eingeleitet wird, dann ist die nachfolgende Abfrage niemals erfüllt.

Soll das so sein?
Gibt es überhaupt die Möglichkeit, dass die Variablen alle die 
aufgezählten Werte annehmen können? Und zwar alle zugleich spätestens in 
dem Moment, wenn der 'programcounter' dort an der Abfrage vorbeikommt?
Gast
Peter II schrieb:
> doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3
> nicht das drin was du erwartest.

Bin bereits einige Male Step-by-Step durch das Programm gegangen. Jedes 
mal konnte ich die If-Bediengung ausführen. Doch sobald ich das Programm 
laufen lasse komme ich nicht in die If-Bediengung.

Habe ebenfalls beim Step-by-Step die Werte der Variabeln var_test1 bis 
var_test3 fortlaufend verglichen und diese waren alle korrekt.
Weiss langsam echt nicht mehr was ich noch probieren soll :S
Gast
Ralf G. schrieb:
> Welchen Wert die Variablen haben, wenn 'var_taste == 0' überblicke
> ich
> gerade nicht. Wenn 'var_taste > 0' und damit die Verschiebung der Werte
> eingeleitet wird, dann ist die nachfolgende Abfrage niemals erfüllt.
>
> Soll das so sein?
> Gibt es überhaupt die Möglichkeit, dass die Variablen alle die
> aufgezählten Werte annehmen können? Und zwar alle zugleich spätestens in
> dem Moment, wenn der 'programcounter' dort an der Abfrage vorbeikommt?

Wie meinst du, dass die nachfolgende Abfrage wird niemals erfüllt?

Ja die Variabeln var_Tast1 - var_Tast9 können (& haben bereits | wurde 
getestet) die Werte 1-16 annehmen. Das sollte kein Problem sein.
Gast
laurentdm schrieb:
> Weiss langsam echt nicht mehr was ich noch probieren soll :S

dann musst du dir eine Möglichkeit der Diagnose schaffen, dein Programm 
ist recht undurchschaubar für fremde.

Ich würde vermuten das es kurzeitig zur erkennen einer anderen Taste 
kommt.
Gast
mit lcd den Inhalt der variablen anzeigen lassen, dann klärt sich das 
schnell. Alles andere ist un ökonomisch.

lcd_int(var_tast1);lcd_int(var_tast2);lcd_int(var_tast3);...
if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))
Versuch mal, statt einem undurchdringlichen Codeknäuel, das Programm in 
einzelne Funktionsmodule zu zerlegen.
Z.B.:
- Taste einlesen
- eingelesenen Tastecode entprellen
- Flanke gedrückt erkennen
- Tastendrücke in Puffer einlesen
- Puffer vergleichen
usw.

Und dann sag Deinem Editor, Tabs durch Leerzeichen ersetzen.
Und dann poste Quelltexte als *.c bzw *.cpp.
Gast
An dem Code ist einiges Wirr. Das Zeug nach der Endlosschleife wird 
sicher nicht ausgeführt. Das nach der zweiten Endlosschleife auch nicht.

Factories haben auf einem µC normalerweise keine Berechtigung, das 
Problem, das eine Factory löst, hat man dort nicht.

Die Delay-Routine wird vermutlich zu gar nichts compiliert, der NOP 
Kommentar sollte durch ein reales nop ersetzt werden.

Falls das Taster in einer Art Matrix abfragt, sollte man eine 
Entprellung  (in die SW) einbauen.

Anstatt so eine komplizierte Geschichte mit den vielen var_tast würde 
ich ein array / string verwenden, in den der Reihe nach alle gedrückten 
Tasten abspeichern, und dann im Fall des Falles den String / das Array 
mit dem abgespeicherten vergleichen.

Und oder einen Schlüssel an den String anhängen, das ganze dann durch 
SHA256 durchnudeln, und mit dem abgespeicherten "Geheimnis" vergleichen. 
kann man beliebig hirnrissig machen.
Gast
laurentdm schrieb:
> Eclipse

Warum belästigst du rechtschaffende hart arbeitende Leute mit deinen
Algorythmenproblemen, wenn du die Werkzeuge haben und bedienen müsstest,
um den Fehler selbst zu finden? Gewöhnlich kann man das mit dem Debugger
erledigen, aber andere Leute fragen, macht ja weniger Mühe.
Übrigens sieht mir dein Script mehr nach C und nicht nach C++ aus, aber
da kann ich mich auch irren. Ansonsten scheinst du ja zu wissen, was
du tust.
Beim Tasten einlesen hat man manchmal das Problem, das die Tasten
prellen und das muss man dann per sinnvoller Routine kompensieren.
Ist aber nichts neues, eher ein alter Hut.
Gast
Cyborg schrieb:
> Übrigens sieht mir dein Script mehr nach C und nicht nach C++ aus, aber
> da kann ich mich auch irren.

hast du überhaupt den Quelltext angeschaut?
1
using namespace QP;
2
BSP_init();      // Initialize board specific stuff
3
QF::init();      // Initialize execution framework
4
factory.build();
Gast
laurentdm schrieb:
> Peter II schrieb:
>> doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3
>> nicht das drin was du erwartest.
>
> Bin bereits einige Male Step-by-Step durch das Programm gegangen. Jedes
> mal konnte ich die If-Bediengung ausführen. Doch sobald ich das Programm
> laufen lasse komme ich nicht in die If-Bediengung.
>
> Habe ebenfalls beim Step-by-Step die Werte der Variabeln var_test1 bis
> var_test3 fortlaufend verglichen und diese waren alle korrekt.
> Weiss langsam echt nicht mehr was ich noch probieren soll :S

Spendiere deinem if noch einen else Zweig und setzte dort den 
Breakpoint. Dann kannst du in Ruhe nachschauen, wie die Werte sind.
Gast
Dir ist aufgefallen, dass du direkt nach einer endlos while Schleife 
eine endlos do/while Schleife hast?
1
while (true)
2
  {
3
    do
4
    {
5
                     ... zu viel code
6
                }
7
    while(1);
8
  }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.