Rückgabewert zum Vergleich

OP #4425635
Lesenswert?
• ▲
▼
Hallo.
Habe hier mit dem Vergleichen eines Rückgabewertes Probleme.
Folgend der spannendste Auszug;
__________________________________
uint8_t Led_Ein(uint8_t Led)
{
switch(Led)
{
case 1: LED_HIGH; Led=1; break;
case 2: LED_MID; Led=2; break;
default: LED_LOW; Led=3; break;
}
return Led;
}

int main(void)
...
MitWert=ADC_Read_Avg(3,64);
if(MitWert>=OBER_BEREICH)
{
if(Led_Ein(0)==2) Led_Ein(1);
else
{
Led_Ein(2);
Wait(2000);
Led_Ein(1);
}
...
_____________________________________

Nach meinem Verständniss, sollte es egal sein, was in der internen 
Klammer steht (Led_Ein(0)==2), da nur der Rückgabewert geprüft wird.
#4425679
Lesenswert?
• ▲
▼
Deine Funktion Led_Ein() ist ziemlich funktionslos bzgl Rückgabewert 
denn du gibts nur zurück, was du übergeben hast. Das ist so ähnlich als 
würde der Chef seiner Sekretärin eine volle Kaffeetasse geben und sie 
anweisen, ihm eine volle Kaffeetasse zu geben.
Sinnvoller wäre es die entsprechende LED "einzuschalten" (was du ja 
anscheinend auch machst) und dann zu überprüfen ob das geklappt hat und 
diesbezüglich einen Rückgabewert generieren.
OP #4425698
Lesenswert?
• ▲
▼
Ja, ich erkenne gerade meinen Denkfehler!
Rückgabe ist unnötig/falsch.

Eigentlich möchte ich zu jeder Zeit vergleichen, welche LED gerade "1" 
ist, um direkte Sprünge von LED1 auf LED3 und umgekehrt, zu vermeiden.
Zustandsänderungen müssen grundsätzlich über LED2 laufen.
Daher muss eine eigene Var mit dem letzten LED-Zustand im main() zur 
Verfügung stehen!?!
#4425796
Lesenswert?
• ▲
▼
__Son´s B. schrieb:
> Eigentlich möchte ich zu jeder Zeit vergleichen, welche LED gerade "1"
> ist, um direkte Sprünge von LED1 auf LED3 und umgekehrt, zu vermeiden.
> Zustandsänderungen müssen grundsätzlich über LED2 laufen.

Das heißt du hast 3 LEDs (1, 2, 3) und willst nur dass es immer über 2 
zum anderen Zustand geht? Mach das doch über einen Zähler der nur die 
Zählrichtung ändert sowie er ein Extrema erreicht hat.
Moderator Persönliche Seite #4426284
Lesenswert?
• ▲
▼
So gehts:
1
void Led_Ein(uint8_t Led)
2
{
3
    static uint8_t last_Led = 0xFF;      // FF = undefined
4

5
    if (last_Led != Led)
6
    {
7
        switch(Led)
8
        {
9
            case 1: LED_HIGH; break;
10
            case 2: LED_MID; break;
11
            default: LED_LOW; break;
12
        }
13
        last_Led = Led;
14
    }
15
}

Die Funktion gibt nichts mehr zurück (void), aber merkt sich intern 
immer den letzten Zustand. Die "Merkvariable" last_Led muss dafür static 
definiert sein, damit sie die Laufzeit der Funktion überlebt.

Wiederholte Aufrufe mit denselben Werten hintereinander werden nun 
einfach ignoriert. Die Leds ändern also nur noch ihren Zustand, wenn 
auch der Wert des Parameters (Led) sich ändert.
Gast #4427172
Lesenswert?
• ▲
▼
__Son´s B. schrieb:
> haeh schrieb:
>> mit drei LEDs sinnvoller den switch ins main zu packen
> Macht es grundsätzlich nicht mehr Sinn, das main() so schlank wie
> möglich zu gestalten, damit das main() besser zu lesen ist.
> Die Folge wären mehrere Funktionen udn Macros.
>
> Was sagt eure Praxis und Erfahrung dazu?

Wenn Du rein objektorientiert arbeitest ist das main immer klein.
Wenn Du prozedural arbeitest kommt es drauf an wie umfangreich Dein 
Projekt ist.
Zehn Zeilen Code mehr im main wenn sie noch gut dokumentiert sind macht 
keinen Unterschied.
Und idR packt man die Statemachine da rein und läßt die dann 
entsprechende Funktionen aufrufen und den Status ändern.
Bei Dir braucht es ja nur ein togglen zwischen den LEDs wenn ich Dich 
nun richtig verstanden habe.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.