IF Vergleich zwischen 2 werten

Gast #3030406
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
   }
#3030418
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
}
Gast #3030885
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
 }
#3030925
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.
Gast #3030927
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
#3030994
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.
Gast #3031964
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
 }
#3031975
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.
#3031985
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
}

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