Vergleich mit if.

Gast #5209997
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
Gast #5210002
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.
#5210104
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
}
Gast #5210110
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
Gast #5210413
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
Beitrag #5210460 wurde von einem Moderator gelöscht.
Gast #5210482
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.
Gast #5210648
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
Gast #5212936
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
#5212982
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
...
Gast #5214055
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren