Werte von Funktion ?!

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo Leute,

Kann es sein das die Werte in den Variablen gespeichert werden und nicht bei jedem Aufruf auf "0" gesetzt werden?
Ich jetzt ein Problem bei einem "LCD Menü".

Es geht um "Enc_Counter" dieser scheint seinen "Zählwert" die ganze Zeit zu behalten. Somit kann ich nicht "flexibel" im Menü "hin & her" Scrollen...

Code:
uint8_t read_Encoder(uint8_t PinPORT, uint8_t BinaryNumber)
{

    static uint8_t Enc_State_new, Enc_State_old, Enc_Counter;
    

    

    Enc_State_new = (PinPORT & BinaryNumber);

    if ((Enc_State_new != Enc_State_old))

    {

        if (Enc_State_new == 0x01)
        {

            if (Enc_State_old == 0x00)
            {
                Enc_Counter++;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {            
                    Enc_Counter--;
                }
                

            }
        }

        if (Enc_State_new == 0x03)
        {

            if (Enc_State_old == 0x01)
            {
                Enc_Counter++;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter--;
                }
            }

        }

        if (Enc_State_new == 0x02)
        {
            if (Enc_State_old == 0x03)
            {
                Enc_Counter++;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter--;
                }
            }

        }

        if (Enc_State_new == 0x00)
        {
            if (Enc_State_old == 0x02)
            {
                Enc_Counter++;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter--;
                }
            }

        }

    }

    Enc_State_old = Enc_State_new;
    
    if (Enc_Counter == 0)
    {
        Enc_Counter = 1;
    }
    
    return(Enc_Counter);

}
 
Ich verschiebe das Thema mal vom Forum Programmierung in das Forum Software, da es mit Programmierung von Flash/Eeprom nichts zu tun hat.

Zum Problem:

Du definierst die Variable innerhalb der Funktion explizit als "static". Damit behält sie die Werte zwischen Funktionsaufrufen bei.
 
Ich verschiebe das Thema mal vom Forum Programmierung in das Forum Software, da es mit Programmierung von Flash/Eeprom nichts zu tun hat.

Zum Problem:

Du definierst die Variable innerhalb der Funktion explizit als "static". Damit behält sie die Werte zwischen Funktionsaufrufen bei.


Oh sorry...

zum Problem :

Anderst bekomme ich es nicht hin...
 
Warum initialisierst Du die Variablen nicht einfach in der Funktion und gut ist?

Ansonsten sagst Du ja mit static, dass die Variable ja fest sein soll. Sprich, wenn die Funktion ein weiteres Mal gerufen wird, werden die Variablen den Wert der letzten Ausführung haben.

Mist, zu langsam.
 
Warum initialisierst Du die Variablen nicht einfach in der Funktion und gut ist?

Ansonsten sagst Du ja mit static, dass die Variable ja fest sein soll. Sprich, wenn die Funktion ein weiteres Mal gerufen wird, werden die Variablen den Wert der letzten Ausführung haben.

Mist, zu langsam.

Wenn ich sie einfach "nur" Initalisiere... "uint8_t..." Zählt meine Variable im Hauptpromm nicht hoch
 
Welche Variablen sollen denn auf 0 sein, wenn Du die Funktion aufrufst?

Was spricht dagegen die Variablen auszulagern mit die extern zu definieren?
 
Wenn ich das Problem so löse :

Funktion im Quellcode von der Software :

Code:
MenueStatus = read_Encoder(PIND, 3, MenueStatus);


Funktion :

Code:
uint8_t read_Encoder(uint8_t PinPORT, uint8_t BinaryNumber, uint8_t Test)
{

    static uint8_t Enc_State_new;
    static uint8_t Enc_State_old;
    
    static uint8_t Enc_Counter = 0;

    Enc_Counter = Test;

    Enc_State_new = (PinPORT & BinaryNumber);

    if ((Enc_State_new != Enc_State_old))

    {    

        if (Enc_State_new == 0x01)
        {

            if (Enc_State_old == 0x00)
            {
                Enc_Counter = Enc_Counter + 1;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {            
                    Enc_Counter = Enc_Counter - 1;
                }
                

            }
        }

        if (Enc_State_new == 0x03)
        {

            if (Enc_State_old == 0x01)
            {
                Enc_Counter = Enc_Counter + 1;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter = Enc_Counter - 1;
                }
            }

        }

        if (Enc_State_new == 0x02)
        {
            if (Enc_State_old == 0x03)
            {
                Enc_Counter = Enc_Counter + 1;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter = Enc_Counter - 1;
                }
            }

        }

        if (Enc_State_new == 0x00)
        {
            if (Enc_State_old == 0x02)
            {
                Enc_Counter = Enc_Counter + 1;
            }
            else
            {
                
                if ((Enc_Counter & 0xFE))
                {
                    Enc_Counter = Enc_Counter - 1;
                }
            }

        }
        
        

    }
        Enc_State_old = Enc_State_new;

        return(Enc_Counter);            


}




Jetzt lese ich quasie ständig den Wert von "MenuStatus" zurück. Dann klappt das wunderbar.
 
Wenn ich sie einfach "nur" Initalisiere... "uint8_t..." Zählt meine Variable im Hauptpromm nicht hoch

... wahrscheinlich, weil du sie dort ebenfalls definiert hast und es sich tatsächlich um zwei lokale Variablen handelt, die zufällig den selben namen haben.

Du musst sie global definieren, nicht innerhalb einer Funktion. Am besten vor main(). Falls der Inhalt der Variable durch eine ISR verändert wird, dann noch als "volatile".

EDIT: jetzt haben sich unsere Beiträge überschnitten. Deinen letzten kann ich noch nicht anschauen, wegen wenig Zeit gerade
 
... wahrscheinlich, weil du sie dort ebenfalls definiert hast und es sich tatsächlich um zwei lokale Variablen handelt, die zufällig den selben namen haben.

Du musst sie global definieren, nicht innerhalb einer Funktion. Am besten vor main(). Falls der Inhalt der Variable durch eine ISR verändert wird, dann noch als "volatile".

Spricht was dagegen, wenn ich das so mache wie in Post " # 7 " ?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)