Hallo
bei meinem Projekt muss ich mehrere Werte vergleichen.
Der Wert x kann zwischen 16 und 211 liegen und wird als Variable
vorgegeben.
Der Wert y kann von 16 bis 194 liegen und darf erst bei 194
berücksichtigt werden.
Habe es mit diesem Code getestet:
1
if(Variable_x&&(y==194))
2
{
3
lcd_printlc(1,5," Pass ");
4
_delay_ms(20);
5
}
6
else
7
{
8
lcd_printlc(1,5," ");
9
}
Bei übereinstimmung soll "Pass" zur Kontolle ausgegebn werden.
"Pass" darf nur ausgegeben werden Variable x und y übereinstimmen.
Leider kommt das Pass auch zwischen durch, wen scheinbar die Werte
addiert werden.
Denkfehler?
LG Bert
Bert schrieb:> Habe es mit diesem Code getestet:if (Variable_x && (y == 194))
Das ergibt "true", wenn Variable_x nicht null ist und y gleich 194 ist.
Eventuell wird Variable_x falsch bestimmt.
Zum Zweiten wäre es denkbar, daß Deine LCD-Routine das "pass" immer an
derselben Stelle des Displays ausgibt. Zwar würde auch mal Leerzeichen
da ausgegeben, aber gut möglich, daß man das trotzdem nachflackern
sieht. Je nachdem, wie schnell die Schleife durchlaufen wird, weil bei
Leerzeichen-Ausgabe kein delay drin ist.
Danke für eure Hilfe. Habe x nicht berechnet. Dadurch klappt es
nicht.$Das Projekt ist bereist ziemlich weit. Das Problem steckt aber in
den vielen Kleinigkeiten
LG Bert
Bert schrieb:> Der Wert x kann zwischen 16 und 211 liegen und wird als Variable> vorgegeben.> Der Wert y kann von 16 bis 194 liegen und darf erst bei 194> berücksichtigt werden.
dann sollte auch richtiger abgefragt werden
1
if(x>15&&x<212)
2
{if(y==194)
3
{lcd_printlc(1,5," hier ist alles OK ");
4
_delay_ms(20);
5
}
6
else
7
{lcd_printlc(1,5," hier ist y !=194 ");
8
_delay_ms(20);
9
}
10
}
11
else
12
{lcd_printlc(1,5," hier ist x ausserhalb 16 bis 211 ");
Danke für deine Hilfe. habe ihn nicht bei der PC Programmierung
vermutet. Egal. Zu meinem Problem. Wenn ich so mache:
1
if((x==c)&&(y>=192))
Durch x == c berechne ich den Punkt der übereinstimmung. Es wird Pass an
der korrekten Stelle ausgeben, wenn die Werte übereinstimmen.
Wie kann ich c auf einen Bereich erweitern?
Die Anzeige Pass bekomme ich bei einer genauen übereinstimmung. Brauche
noch einen Bereich von ca +3/-3 zur genauen Position dazu.
Hat jemand eine Idee dazu?
LG Bert
Hallo
das klappt soweit.
Wenn ich das richtig verstehe liegt der Bereich zwischen (wenn x=100)
von 97 bis 103?
Habe nur noch ein Problem mit der "Schärfe".
Beispiel:
Vorgabe von x = 100
Bereich (mit +/- 3) = von 97 bis 103
"Schärfe" ist 6. Damit ist die Übereinstimmung von 97 bis 103.
Wie kann ich das verändern (verkleinern) ohne alles neu zu machen oder
einstellbar?
LG Bert
Spätestens hier wird m.E. eine Trennung von Abfrage und Aktion
notwendig, also z.B.
1
intGleichheit(intx,inty)
2
{
3
intlow=y-SCHAERFE;
4
inthigh;
5
6
/* Beispiel Deiner bisher ungenannten Randbedingungen */
7
if(low<17){low=17}
8
9
high=low+2*SCHAERFE;
10
11
/* Beispiel Deiner Kriterien */
12
if(x<low){return0;}
13
if(x>high){return0;}
14
15
return1;
16
}
17
18
19
...
20
21
if(Gleichheit(x,y))
22
{
23
lcd_printlc(1,5," Pass ");
24
_delay_ms(20);
25
}
26
else
27
{
28
lcd_printlc(1,5," ");
29
}
Und ja, später sollte man sich mit bool beschäftigen oder inline oder
C++ oder was auch immer.
Und nein, ich bin kein Freund von mini-Funktionen. Im Gegenteil: es gibt
Situationen, in denen >>1000 Zeilen ok sind. Bei Deinem Kenntnisstand
und der Komplexität der Aufgaben aber nicht.
Hallo Achim
ein paar der Randbedingung ist z.B. die Schärfe. Damit meine ich die
Kontaktfläche mit einem Cursor und einem Rand. Hat der Rand 5
Kontaktflächen am Rand ist die "Schärfe" sehr klein. Mit 3
Kontaktflächen ist die Berührung kleiner und mit einer Kontaktfläche ist
es extrem klein und sehr schwierig. Der Rand ist Definiert in Richtung x
und y. Vergleiche es mit einem Spiel. Der Schläger wird extra bewegt,
der Ball bewegt sich unabhängig, treffen beide zusammen geht der Ball
zurück, treffen sie sich nicht geht der Ball ins aus. So was ist der
Knackpunkt, wie im Beispiel muss ich dabei zwei veränderliche Werte
vergleichen, nach links oder rechts oder unten oder oben auswerten und
dabei die Grösse, Winkel und Geschwindigkeit beachten.
LG Bert
Bert schrieb:> ein paar der Randbedingung ist z.B. die Schärfe. Damit meine ich die> Kontaktfläche mit einem Cursor und einem Rand. ...
Beschreib bitte doch erst mal das ursprungliche Problem das du zu lösen
versuchst. Höchstwahrscheinlich wird die Lösung dann um ein vielfaches
einfacher.
Hallo
hatte bereits im Eingang das Problem beschrieben. Der Cursor soll in x
und y Richtung bewegt werden. Gleichzeitig kommt er an eine "Schläger".
Wenn alle 3 Werte sich treffen soll es ausgewertet werden.
Die x Richtung liegt zwischen 16 und 211. Die y liegt zwischen 16 und
194. Der "Schläger" kann zwischen 16 und 211 liegen.
Die Erkennung soll erfolgen wenn x==16-211 und y=193 oder 194 und der
Schläger auch bei 16 und 211 liegt mit dem gleichen Wert wie x. Stell
dir das ganze als Pong vor. Alle 3 Werte ändern sich ständig. Treffen
sie sich soll es ausgewertet werden. Sind die Werte für x und y ungleich
dem Schläger soll es anders auch ausgewertet werden. Dann kommt noch die
Schärfe dazu. Auf dem Schläger soll es entweder 5 oder 3 oder 1 treffen.
Bin dabei die oberen Versionen zu testen. Sieht schon recht gut aus.
Vielleicht hast du eine Bessere Idee.
LG Bert
Danke für die Korrektur. Wenn der fehlende Buchstabe dein einziges
Problem, mach weiter so. Kennst doch den Grundsatz, wer Fehler findet
darf sie behalten.
Hallo Eric
Danke für deine Info. Werde es gleich ausprobieren. Habe aber schon ein
Problem gesehen.
Nach meinem C-Buch, läuft bool nur bei C++. Ich arbeite nur mit C.
Das ganze soll als eine Grundlage für verschiedene Spiele dienen mit
einem TFT Farb Display und einer Grösse von 320 x 240 mit 3,2 Zoll und
mit I2C Bus
LG Bert