Rückgabewert zum Vergleich

OP #4425635
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.
__Son´s B. schrieb:
> Anstatt "if(Led_Ein(0)==2)" nur den Rückgabewert vergleicht, sendet er
> erst einmal die "0" an die Funktion Led_Ein().

Ja was denn sonst?
Es wird Led_Ein(0) aufgerufen und dann
der Rückgabewert mit 2 verglichen.
Was ist dir an der Konstruktion unklar? Schau dir notfalls das 
Assemblerlisting an.
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
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!?!
__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.
Gast
Wenn Du schon mit Oberwert arbeitest und Du so wie das verstehe eine LED 
auf LOW, MID oder HIGH haben willst je nachdem wie der Poti steht dann 
mach's doch direkt im main ohne doppelten Vergleich.
Gast
Oh immer den ganzen Thread durchlesen.
Ist aber auch mit drei LEDs sinnvoller den switch ins main zu packen und 
dort die Variable anlegen.
Male Dir Deine Statemachine auf's Papier und guck Dir die Übergänge an.
__Son´s B. schrieb:
> 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?

Ja, in der Regel schon. Aber dazu müssen die Funktionen entsprechend gut 
designt sein.
Moderator Persönliche Seite
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
__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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.