mikrocontroller.net

Forum: Compiler & IDEs Globale Variable in Funktionsaufruf


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Carsten D. (carsten_77)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HildeK (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: basti195 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klug Schwätzer (Gast)
Datum:

Bewertung
4 lesenswert
nicht 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

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Carsten D. (carsten_77)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
2 lesenswert
nicht 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)

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Klug Schwätzer (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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 ....

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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] !

Autor: Christian S. (roehrenvorheizer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.