Forum: Mikrocontroller und Digitale Elektronik Variable in funktion deklarieren?


von Frank (Gast)


Lesenswert?

Hallo,
ich rufe aus meiner main-function eine funktion test() auf. In dieser 
Funktion benötige ich variablen, die aber nur in dieser Funktion 
benötigt werden.

Wie macht man das am besten? Schon über der main-funktion als volatile 
deklarieren? Dann wären die ja quasi in jeder anderen funktion sichtbar 
und könnten verändert werden, oder durch doppelte bezeichnung ein 
fehler.
oder erst in der funktion test() selber? Dann würden die ja jedesmal 
beim funktionsaufruf deklariert und initialisiert werden, wodurch das 
eigentlich unsinnig wird.
1
volatile unsigned int test1 = 0;
2
int main(){
3
...
4
while(1){
5
 ...
6
test();
7
}
8
}
9
10
void test(void){
11
test1++;
12
}

[code]
int main(){
...
while(1){
 ...
test();
}
}

void test(void){
unsigned test1 = 0; // wird ja bei jedem funktionsaufruf wieder auf null 
gesetzt, wird dafür nur in dieser funktion verwendet
test1++;
}

von Peter II (Gast)


Lesenswert?

das volatile ist hier schon mal unnötig.

Was soll denn die Variabel speichern? Soll der Inhalt erhalten bleiben 
wenn die Funktion verlassen wird?

von NJ (Gast)


Lesenswert?

Hi!

Ist das "static"-Keyword vielleicht das was Du suchst?

von Joggel (Gast)


Lesenswert?

Es gibt Buecher in der Art von : "Ich, C, die Welt und Alles". zB von 
B.Stroustrup.

von Falk B. (falk)


Lesenswert?

@ Frank (Gast)

>Wie macht man das am besten? Schon über der main-funktion als volatile
>deklarieren?

Nein.

>Dann wären die ja quasi in jeder anderen funktion sichtbar
>und könnten verändert werden,

Ja.


>oder erst in der funktion test() selber?

Sicher.

> Dann würden die ja jedesmal
>beim funktionsaufruf deklariert und initialisiert werden, wodurch das
>eigentlich unsinnig wird.

Nö, das ist der Normalfall aller lokalen Variablen.
Wenn lokale Variablen nach dem Verlassen der Funktion und Wiedereintritt 
erhalten bleiben sollen, müssen sie als static deklariert werden.

von Michael B. (laberkopp)


Lesenswert?

Frank schrieb:
> Wie macht man das am besten? Schon über der main-funktion als volatile
> deklarieren? Dann wären die ja quasi in jeder anderen funktion sichtbar
> und könnten verändert werden, oder durch doppelte bezeichnung ein
> fehler.
> oder erst in der funktion test() selber?
> Dann würden die ja jedesmal beim funktionsaufruf deklariert

Das kann Laufzeit kosten. Wenn man genug Speicher hat, dann kann man die 
Variable ausserhalb der Funktion deklarieren. Der Speicherplatz ist dann 
das ganze Programm hindurch belegt.

Deklariert man innerhalb der Funktion und hat die Funktion sonst keine 
lokalen Variablen, und diese Variablen werden auch nicht als Register 
wegoptimiert, dann wäre ein ADD SP,+4 und SUB SP,+4 oder so nötig, also 
zusätzliche Instruktionen und zusätzliche Laufzeit, ausserden erfolgen 
die Zugriffe dann an absolute Adressen und nicht relativ zum 
Spackpointer, was je nach Prozessor ebenfalls mehr Laufzeit kosten kann.


Also: Im Prinzip immer lokal definieren. In Ausnahmefällen kann es nötig 
sein, static lokal zu definieren. Ein Game-Of-Life das ich mal für 
Windows 3.1 geschrieben hatte, hat IMMENS davon profitiert, daß das 
Board statt relativ adressiert einfach static deklariert wurde, das war 
der Unterschied zwischen lahmarschig und rasend schnell. Global zu 
definieren ist nie nötig wenn man den Wert nur innerhalb einer Funktion 
braucht und verwenden will.

> und initialisiert werden, wodurch das eigentlich unsinnig wird.

Kommt drauf an.

So eine Funktion wird ja hoffentlich mehr als bloss 1 mal aufgerufen.

Wenn dann JEDESMAL beim Eintritt der Wert (auf 0) initialisiert werden 
soll/muss, und nicht mit dem Wert vom vorherigen Lauf weitergerechnet 
werden kann/darf, dann musst du SOWIESO am Anfang der Funktion ein
1
    test1 = 0;
schreiben, das eine mal bei
1
volatile unsigned int test1 = 0;
reicht dann nicht.

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?


von Baendiger (Gast)


Lesenswert?

In der Funktion als s static deklarieren.

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.