Forum: Compiler & IDEs IF Vergleich zwischen 2 werten


von Andreas (Gast)


Lesenswert?

Haalo,
Irgendwie steh ich grad auf'n Schlauch.
Ich möchte den ADC-Wert vergleichen,
leider haut mein Vergleich nicht hin.
1
uint16_t  adcval;
2
3
if (adcval > 0 && adcval < 620)// liegt der ADC Wert zwischen 0 und 620
4
   {
5
   tuwas_1():
6
   }
7
    
8
if (adcval > 620 && adcval < 768)// liegt der ADC Wert zwischen 620 und 768
9
   {
10
   tuwas_2():
11
   }

von Dr. Sommer (Gast)


Lesenswert?

Andreas schrieb:
> leider haut mein Vergleich nicht hin.
was haut denn da nicht hin? Wenn adcval = 0 ist, gleich 620 ist oder 
größer/gleich 768 passiert gar nichts, soll das so?

von Johannes M. (johannesm)


Lesenswert?

Doppelpunkte durch Semikolon ersetzen?

von Fabian O. (xfr)


Lesenswert?

Beim Wert 0 oder 620 soll doch bestimmt auch etwas passieren. Da ein 
uint16_t nie negativ werden kann, reicht:
1
uint16_t adcval;
2
3
if (adcval <= 620) // liegt der ADC Wert zwischen 0 und 620
4
{
5
  tuwas_1();
6
}
7
else if (adcval <= 768) // liegt der ADC Wert zwischen 621 und 768
8
{
9
  tuwas_2();
10
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

adcval ist nicht initialisiert.

Der Compiler kann annehmen, daß die Vergleiche immer falsch sind und 
Vergleiche same if-Blöcke wegwerfen.

Fabian O. schrieb:

> [Komplett anderen Code]

Das sind aber Vergleiche, die mit dem Original nix zu tun haben.

von Andreas (Gast)


Lesenswert?

adcval soll verglichen werden ob es zwischen 0 u. 620  , 620 u. 768 .

Das sollte so sein wenn  Zb. adcval =120  sollte ja der erste vergleich 
passen.

Oder ist meine Vorgehensweise nicht dafür geeignet.
1
uint16_t adcval = 120;
2
3
if (adcval > 0 && adcval < 620)// liegt der ADC Wert zwischen 0 und 620 
4
{ 
5
tuwas_1();
6
 } 
7
8
if (adcval > 620 && adcval < 768)// liegt der ADC Wert zwischen 620 und 768 
9
{ 
10
tuwas_2();
11
 }

von Fabian O. (xfr)


Lesenswert?

Die interessanten Fälle sind diese:

Was soll passieren, wenn adcval = 0 ist?
Was soll passieren, wenn adcval = 620 ist?
Was soll passieren, wenn adcval = 768 ist?

In Deinem Code passiert in diesen Fällen nichts. Wenn Du das so willst, 
dann stimmt er. Ansonsten nicht.

von NurEinGast (Gast)


Lesenswert?

Du schreibst "if adcval > 0". Bei Dir wird das Programm also bei 0 
nichts tun.


Vorschlag :
1
uint16_t adcval = 120;
2
3
if (adcval <= 620 )// liegt der ADC Wert zwischen 0 und 620 
4
{ 
5
tuwas_1();
6
} 
7
8
if (adcval > 620 && adcval < 768)// liegt der ADC Wert zwischen 621 und 767
9
{ 
10
tuwas_2();
11
 }

> adcval soll verglichen werden ob es zwischen 0 u. 620  , 620 u. 768
Und bei genau 620 ?

ob <= 620 oder >= 620 muss Du entscheiden.
Ausser Du möchtest, dass bei 620 nichts passiert.

Beachte noch :

(adcval > 620 && adcval < 768)// liegt der ADC Wert zwischen 621 
und 767

von Karl H. (kbuchegg)


Lesenswert?

Das nächste was ich tun würde:

if - else Ketten aufzubauen.
Jeder Grenzwert, den du in deinem Code 2-mal angibst, ist einmal zuviel. 
Jedes mal, wenn du den Wert hinschreibst öffnest du eine potentielle 
Fehlerquelle.

Schreibst du

  if( adcval <= 620 )

    ..

  else
    ...

dann ist automatisch klar, dass im else-Zweig adcval größer als 620 sein 
MUSS! Das kann gar nicht anders sein, denn wenn adcval kleiner/gleich 
620 wäre, dann würde der Code nicht ins else kommen, sondern den 
then-Zweig vom if nehmen


   if( adcval <= 620 )        // 0 bis 620, jeweils inklusive
     ....

   else if( adcval <= 768 )   // 621 bis 768. jeweils inklusive
     ...

   else if( adcval <= 1000 )  // 769 bis 1000. jeweils inklusive
     ...

   else                       // größer als 1000
     ...

hier steht jeder Grenzwert nur ein einziges mal im Code. Bei einer 
Veränderung eines Grenzwertes brauche ich also nur EINEN Wert anzupassen 
und nicht 2. Werden die 620 auf 640 erhöht, dann geschieht das an EINER 
Stelle und der nachfolgende Abfragebereich verkleinert sich ganz von 
alleine. D.h. ich laufe nicht Gefahr, dass ich hier einen Fehler mache 
und den nachfolgenden Bereich vergesse anzupassen.

von Bronco (Gast)


Lesenswert?

Ich frage mich: was haut denn nicht hin?

von Andreas (Gast)


Lesenswert?

Wenn ich das so mach wie vorgeschlagen,
1.hauts nicht hin
2.bekomm ich beim 3 else error: expected ';' before '{' token
1
if( adcval <= 512 )        // 0 bis 512
2
 {
3
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end + ypos,255,255,255);
4
 }
5
6
else if( adcval <= 620 )   // 513 bis 620
7
 {
8
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end + ypos,255,255,0);
9
 }
10
11
else ( adcval <= 730 )  // Grösser 730
12
 {
13
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end + ypos,255,0,0);
14
 }
15
16
17
Das hier funktioniert.
18
19
if (adcval > 0 && adcval < 512 )        // 0 bis 511
20
 { 
21
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end +   ypos,255,255,255);
22
 } 
23
24
if (adcval > 511 && adcval < 620)        // 511 bis 619
25
 { 
26
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end + ypos,255,255,0);
27
 }
28
 
29
if (adcval > 619)        // Grösser als619
30
 { 
31
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos,x_end +  xpos, y_end + ypos,255,0,0);
32
 }

von Johannes M. (johannesm)


Lesenswert?

Andreas schrieb:
> else ( adcval <= 730 )

Beim else einen Vergleich machen kann auch nicht gehen.

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:

> 2.bekomm ich beim 3 else error: expected ';' before '{' token

>
> else ( adcval <= 730 )  // Grösser 730

else if ( adcval <= 730 )
    ****

Grundlegende Kenntnisse der Programmiersprache setze ich eigentlich 
schon vorraus. So ungefähr auf dem Level: 1. Unterrichtseinheit - 1. 
Stunde.


Tu dir selbst einen Gefallen und kauf dir ein C-Buch und arbeite 
zumindest das erste Drittel durch.

von Andreas (Gast)


Lesenswert?

Es war heut schon ein langer Tag.
trotzdem danke.
mfg

von Fabian O. (xfr)


Lesenswert?

Es hilft auch ungemein, wenn man sich etwas Mühe bei der 
Codeformatierung gibt. Nicht nur den Forenmitgliedern, die den Code 
lesen sollen, sondern auch Dir selber beim Finden von Fehlern.

Dazu gehört u.a., dass man die geschweiften Klammern auf die gleiche 
Ebene wie das if bzw. else setzt und Leerzeichen einheitlich verwendet:
1
if (adcval < 512) // 0 bis 511
2
{
3
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos, x_end + xpos, y_end + ypos, 255, 255, 255);
4
} 
5
else if (adcval < 620) // 512 bis 619
6
{ 
7
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos, x_end + xpos, y_end + ypos, 255, 255, 0);
8
}
9
else // 620 oder größer
10
{ 
11
  DrawLine_RGBColor(x_mitte + xpos, y_mitte + ypos, x_end + xpos, y_end + ypos, 255, 0, 0);
12
}

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.