Globale Variable in Funktionsaufruf

#5415826
Lesenswert?

Hallo Forum !!!

Nach längeren Überlegungen muss ich doch mal die Profi´s hier um Rat 
fragen:

Also, ich habe (z.B.) 4 globale Variablen, welche in einer Variablen.h 
als extern deklariert worden sind:

extern uint8_t Speicher_1;
extern uint8_t Speicher_2;
extern uint8_t Speicher_3;
extern uint8_t Speicher_4;



Diese Variablen werden von überall her angesprochen und beinhalten immer 
einen aktuellen "Speicher"-Wert.

Ich möchte nun, beim Aufruf einer Funktion angeben können, welche 
Variable in der Funktion benutzt wird.

Also ca. so:

void Funktion (uint8_t Byte, uint8_t Bit, XXXX welche Speichervariable)
{
 uint8_t Neuer_Wert;
 XXX welche Speichervariable = Neuer_Wert
}



Wie kann man das am besten lösen ?
Sollte dafür ein Struct deklariert werden, in dem die Variablen abgelegt 
werden?

Über Ideen und Vorschläge würde ich mich freuen...Danke
Gast #5415843
Lesenswert?

Du könntest die Adresse der zu setzenden Variablen übergeben und den 
Wert an die entsprechende Adresse schreiben.

void FunktionX (uint8_t Byte, uint8_t Bit, uint8_t * speicher){
*speicher = 123;
...
}


Aufruf :

FunktionX (..,..,&speicher1);
#5415873
Lesenswert?

Carsten D. schrieb:
> Diese Variablen werden von überall her angesprochen und beinhalten immer
> einen aktuellen "Speicher"-Wert.

Nur das Du mit "extern" noch keinen Speicher belegst. Wo sind denn die 
externen Variablen definiert?
Eigentlich müsste der Compiler meckern.

Funktionieren sollte es mit extern uint8_t Speicher_1 = 0;

Oder verwechselst Du hier "extern" mit "volatile"?
#5416607
Lesenswert?

Carsten D. schrieb:
> Die Speichervariablen werden in der Variablen.c / Variablen.h
> deklariert,
> bzw. initialisiert - von daher auch keine Meldung des Compilers.
>
> Danke an Basti195 - der Adressoperator fehlte mir beim Aufruf und führte
> zum Ergebnis.

Das hat auch den Vorteil, dass die Funktion nicht mehr von globalen 
Variablen abhängig ist. Man sollte es möglichst vermeiden, solche kreuz 
und quer im Code zu benutzen.

Klug Schwätzer schrieb:
> Carsten D. schrieb:
>> Nach längeren Überlegungen muss ich doch mal die Profi´s hier um Rat
>> fragen:
>
> Professioneller kämst du herüber wenn du den Deppenapostroph
> vermeiden würdest.

Wenn es denn wenigstens der wäre. Es ist aber nicht mal ein Apostroph, 
sondern ein accent grave mit einem Leerzeichen drunter.
Moderator #5416637
Lesenswert?

Rolf M. schrieb:
> Klug Schwätzer schrieb:
>> Carsten D. schrieb:
>>> Nach längeren Überlegungen muss ich doch mal die Profi´s hier um Rat
>>> fragen:
>>
>> Professioneller kämst du herüber wenn du den Deppenapostroph
>> vermeiden würdest.
>
> Wenn es denn wenigstens der wäre. Es ist aber nicht mal ein Apostroph,
> sondern ein accent grave mit einem Leerzeichen drunter.

Noch schlimmer: Es ist sogar ein Akut!

(Offtopic zwar, aber die ursprüngliche Frage wurde von den
Profi'`´΄‘’′╵╹s ja bereits beantwortet)
Gast #5416659
Lesenswert?

Yalu X. schrieb:
> Noch schlimmer: Es ist sogar ein Akut!
>
> (Offtopic zwar, aber die ursprüngliche Frage wurde von den
> Profi'`´΄‘’′╵╹s ja bereits beantwortet)

Es ist ja schon ein erheblicher Fortschritt dass sich hier
jemand damit auseinandersetzt.

Es gab schon jähzornige Moderatoren die Beiträge zum
Deppenapostroph gelöscht haben. Damit outest du dich zunächst
mal als jemand der nicht zu den Jähzornigen gehört.

Danke dafür, solange du nicht auf die Idee kommst doch noch
zu löschen. Aber das (der, die) Böse lauert im Hintergrund
immer und überall ....
Gast #5417659
Lesenswert?

Rolf M. schrieb:
> Das hat auch den Vorteil, dass die Funktion nicht mehr von globalen
> Variablen abhängig ist. Man sollte es möglichst vermeiden, solche kreuz
> und quer im Code zu benutzen.

Versteckte Abhängigkeiten wie ein direkter Zugriff auf globale 
Variablen, die nicht auf einen Blick  an der Signatur der Funktion 
erkennbar sind, verdecken den Informationsfluss im Programm. Mit mehr 
Erfahrung lernt man (zumindest die meisten...), sowas wenn irgendwie 
möglich zu vermeiden.

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