Forum: Compiler & IDEs Globale Variable in Funktionsaufruf


von Carsten D. (carsten_77)


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

von HildeK (Gast)


Lesenswert?

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

Setze doch die Variablen in ein Array und übergebe statt "XXXX welche 
Speichervariable" deren Index.

von basti195 (Gast)


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);

von Klug Schwätzer (Gast)


Lesenswert?

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.

http://www.deppenapostroph.info

von Pete K. (pete77)


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"?

: Bearbeitet durch User
von Carsten D. (carsten_77)


Lesenswert?

Erstmal lieben Dank für die Anregungen, Hinweise...

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.

von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


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)

von Teo D. (teoderix)


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)

Nu last aber mal gut sein, das is hier ja kein Buchdruck.

(OK, hübsch sied's nich' aus ;)

von Klug Schwätzer (Gast)


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 ....

von Manfred (Gast)


Lesenswert?

Carsten D. schrieb:
> angeben können, welche Variable

int Variable[4] = {100, 500, 1000, 2000};

void Funktion (Variable[0])
...

void Funktion (Variable[3])
...

Aufpassen: Deklarieren [4], aber Zugriff mit [0]..[3] !

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

das könnte man lösen, indem man einen Zeiger definiert, der die Adressen 
der vier Variablen übergeben bekommt.

Je nachdem, welche Adresse angegeben wird, gilt deren Variable.

MfG

von Tom (Gast)


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.

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.