Forum: PC-Programmierung Vergleich mit if.


von Bert (Gast)


Lesenswert?

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

: Verschoben durch Moderator
von Dussel (Gast)


Lesenswert?

Wenn Variable_x nicht 0 und y 194 ist, wird Pass ausgegeben. Die 
Variable x kommt gar nicht vor.

von Nop (Gast)


Lesenswert?

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.

von Pete K. (pete77)


Lesenswert?

if ((Variable_x == 194) && (y == 194))

: Bearbeitet durch User
von Dussel (Gast)


Lesenswert?

Übrigens sollte ein Projekt ein wenig mehr ausgereift sein, bevor es 
hier vorgestellt wird.

von Bert (Gast)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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 ");
13
  _delay_ms(20);
14
}

von Bert (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

Bert schrieb:
> Hat jemand eine Idee dazu?

Ja, ersetze
1
(x == c)
 durch
1
((x > c-3) && (x < c+3))

von Bert (Gast)


Lesenswert?

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

von 123 (Gast)


Lesenswert?

schaerfe = 2;

((x > c-schaerfe) && (x < c+schaerfe))

von Ulf L. (ulf_l)


Lesenswert?

Hallo

Na dann mußt die "3" im vorhergehenden Beispiel durch eine Variable 
"Schärfe/2" ersetzen.

Gruß Ulf

Beitrag #5210460 wurde von einem Moderator gelöscht.
von A. S. (Gast)


Lesenswert?

Spätestens hier wird m.E. eine Trennung von Abfrage und Aktion 
notwendig, also z.B.
1
int Gleichheit(int x, int y)
2
{
3
int low = y - SCHAERFE;
4
int high;
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)  {return 0;}
13
   if(x > high) {return 0;}
14
15
   return 1;
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.

von Bert (Gast)


Lesenswert?

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

von Eric B. (beric)


Lesenswert?

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.

von Bert (Gast)


Lesenswert?

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

von Eric B. (beric)


Lesenswert?

Das ist schon eine ganz andere Beschreibung als in deinem Eingangspost.
1
#define X_MIN  16
2
#define X_MAX 211
3
#define Y_MIN 193
4
#define Y_MAX 194
5
#define SLACK   5
6
7
bool_t pass(int x, int y, int s)
8
{
9
  int overlap = x - s;
10
11
  return
12
    ((Y_MIN <= y) && (y <= Y_MAX)) &&            /* Y in range? */
13
    ((X_MIN <= x) && (x <= X_MAX)) &&            /* X in range? */
14
    ((-SLACK <= overlap) && (overlap <= SLACK)); /* X hits S?   */
15
}
16
17
...
18
  if ( pass(x, y, schlaeger) )
19
  {
20
    print("PASS");
21
  }
22
...

von Legastheniker (Gast)


Lesenswert?

Bert schrieb:
> Gleichzeitig kommt er an eine "Schläger".

einen Schläger!

von Bert (Gast)


Lesenswert?

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

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Bert schrieb:
> Nach meinem C-Buch, läuft bool nur bei C++. Ich arbeite nur mit C.
1
#include <stdbool.h>

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.