mikrocontroller.net

Forum: PC-Programmierung Vergleich mit if.


Autor: Bert (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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:
if (Variable_x && (y == 194))
      {
        lcd_printlc(1,5," Pass ");
        _delay_ms(20);
      }
    else
      {
      lcd_printlc(1,5,"     ");
      } 
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
Autor: Dussel (Gast)
Datum:

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

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if ((Variable_x == 194) && (y == 194))

: Bearbeitet durch User
Autor: Dussel (Gast)
Datum:

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

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht 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
if(x>15 && x<212)
{ if(y==194)
  { lcd_printlc(1,5," hier ist alles OK ");
    _delay_ms(20);
  }
  else
  { lcd_printlc(1,5," hier ist y !=194 ");
    _delay_ms(20);
  }
}
else
{ lcd_printlc(1,5," hier ist x ausserhalb 16 bis 211 ");
  _delay_ms(20);
}

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe. habe ihn nicht bei der PC Programmierung 
vermutet. Egal. Zu meinem Problem. Wenn ich so mache:
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

Autor: Wolfgang (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bert schrieb:
> Hat jemand eine Idee dazu?

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

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaerfe = 2;

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

Autor: Ulf L. (ulf_l)
Datum:

Bewertung
0 lesenswert
nicht 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.
Autor: Achim S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spätestens hier wird m.E. eine Trennung von Abfrage und Aktion 
notwendig, also z.B.

int Gleichheit(int x, int y)
{
int low = y - SCHAERFE;
int high;

   /* Beispiel Deiner bisher ungenannten Randbedingungen */
   if(low < 17) {low = 17}

   high = low + 2*SCHAERFE;

   /* Beispiel Deiner Kriterien */
   if(x < low)  {return 0;}
   if(x > high) {return 0;}

   return 1;
}


...

   if(Gleichheit(x,y))
   {
      lcd_printlc(1,5," Pass ");
      _delay_ms(20);
   }
   else
   {
      lcd_printlc(1,5,"     ");
   } 

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.

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eric B. (beric)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist schon eine ganz andere Beschreibung als in deinem Eingangspost.
#define X_MIN  16
#define X_MAX 211
#define Y_MIN 193
#define Y_MAX 194
#define SLACK   5

bool_t pass(int x, int y, int s)
{
  int overlap = x - s;

  return
    ((Y_MIN <= y) && (y <= Y_MAX)) &&            /* Y in range? */
    ((X_MIN <= x) && (x <= X_MAX)) &&            /* X in range? */
    ((-SLACK <= overlap) && (overlap <= SLACK)); /* X hits S?   */
}

...
  if ( pass(x, y, schlaeger) )
  {
    print("PASS");
  }
...

Autor: Legastheniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bert schrieb:
> Gleichzeitig kommt er an eine "Schläger".

einen Schläger!

Autor: Bert (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: Kaj G. (Firma: RUB) (bloody)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.