Forum: Mikrocontroller und Digitale Elektronik warum keine globalen Variablen


von Globalus (Gast)


Lesenswert?

Hallo,

ich muss ja zugeben, ein begnadeter Programmierer bin ich nicht, aber 
durchaus gewillt, mich weiter fort zu bilden.
Daher lese ich immer wieder mal das eine oder andere C Buch.

Nur was mir wirklich nicht in den Kopf will, warum wird so gegen globale 
Variablen gewettert?

Das Argument, dass von außen fremde Funktionen auf diese einwirken 
könnten und so zu Schäden oder ungewünschten Veränderungen führen ist 
doch irgendwie konstruiert, denn letztenendes sind doch auch globale 
Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm 
zugänglich...
Der Verzicht auf globale Variablen wird dann durch Einführen von 
diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der 
Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner 
Ansicht nach zu weniger Transparenz führt...

von Mikro 7. (mikro77)


Lesenswert?


von Richard H. (richard_h27)


Lesenswert?

Globalus schrieb:
> warum wird so gegen globale Variablen gewettert?

Man weiß doch, wo die Globalisierung hinführt.

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

Mikro 7. schrieb:
> stackoverflow

Globale Variablen sind (zumindest auf uC) DIE Strategie gegen 
"stackoverflow" :-) und hardfault

Zudem sind keine der genannten Argumente stichhaltig, es gibt nämlich 
sowas wie "modulares und strukturiertes" Programmieren auch in C ganz 
ohne OOP. Am einfachsten, indem man den Funktionen und globalen 
Variablen eines Moduls den Modulnamen voranstellt.

von B. S. (bestucki)


Lesenswert?

Globalus schrieb:
> Das Argument, dass von außen fremde Funktionen auf diese einwirken
> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist
> doch irgendwie konstruiert, denn letztenendes sind doch auch globale
> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm
> zugänglich...

Aus einem Programm, das möglicherweise aus Millionen von Lines of Code 
und mehreren 10000 globalen Variablen besteht. Viel Spass beim debuggen, 
wenn mal eine Variable mit dem falschen beschrieben wurde. Resultat: 
Chaos

Bibliotheken könnte man auch keine schreiben. Jede Bibliothek müsste 
ihre eigenen globalen Variablen mitbringen, die dann im Speicher 
vergammeln. Doppelte Namen müsste man auch verhindern. Resultat: Chaos

Globalus schrieb:
> Der Verzicht auf globale Variablen wird dann durch Einführen von
> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der
> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner
> Ansicht nach zu weniger Transparenz führt...

Wenn man nicht auf fremde Speicherbereiche zugreifen will, macht mans 
halt global? Man muss so oder so zugreifen, ob global oder nicht. 
Resultat: Chaos

Transparenz? Siehe meinen ersten Einwand.

von Ralf G. (ralg)


Lesenswert?

Globalus schrieb:
> Das Argument, dass von außen fremde Funktionen auf diese einwirken
> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist
> doch irgendwie konstruiert, denn letztenendes sind doch auch globale
> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm
> zugänglich...
Globale Variablen sind von überall und immer zugänglich.
> Der Verzicht auf globale Variablen wird dann durch Einführen von
> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der
> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner
> Ansicht nach zu weniger Transparenz führt...
Nee, das passt nicht.

Du hast eine Variable, die du schreiben möchtest. Der direkte Zugriff 
könnte jetzt Ärger machen, wenn von dem neu geschriebenen Wert noch 
andere Variablen abhängen. Also definiert man die Variable 'static' in 
einem Modul und läßt das Beschreiben nur über eine Funktion zu, welche 
sich dann gleichzeitig um die - nach außen hin unsichtbaren - 
Abhängigkeiten kümmert. Das muss am Anfang der Entwicklung noch gar 
nicht alles feststehen. (Wie man das jetzt 'sortiert' und in Module 
packt, allerdings schon.) Falls dann die Funktion nur die Variable 
beschreibt - macht nichts. Wenn jetzt aber eine Abhängigkeit dazukommt, 
würdest du deinen ganzen Quelltext durchsuchen und eine Zusatzfunktion 
oder -zuweisung einbauen. Aber nichts vergessen!, und immer schön alles 
ändern! ;-)

(Beispiel, irgendein PC-Programm: Es nützt überhaupt nichts eine 
Variable 'window_width' mit 1000 zu beschreiben, es wäre nicht schlecht, 
wenn das Fenster dann mit dieser Breite, die Scrollbalken, 
Schaltflächen, evtl. Textumbrüche auch neu gezeichnet werden.)

von Sebastian (Gast)


Lesenswert?

Es gibt zwei Aspekte, wie eine variable "global" sein kann: Sichtbarkeit 
und Lebensdauer.
Eine Variable mit globaler Sichtbarkeit hat immer auch globale 
Lebensdauer.

Beide Aspekte tragen zum schlechten Ruf bei. Aus vielen Gründen, die 
folgenden sind nicht alles.

Sichtbarkeit: Funktionen, die auf global sichtbare Variablen zugreifen, 
sieht man das an ihrer Deklaration nicht an. Man muss den Code lesen.

Lebensdauer: Variablen mit globaler Lebensdauer führen dazu, dass das 
Programm viele "Zustände" hat. Funktionen, die darauf zugreifen, 
reagieren nicht immer gleich, auch wenn alle Parameter gleich sind. Das 
kann verwirrend sein.

Lebensdauer: Es ist gefährlich, Funktionen, die auf Variablen mit 
globaler Lebensdauer zugreifen, aus mehreren Threads (bzw. ISRs, ...) 
aufzurufen.

Es gibt sie genau einmal pro Prozess...
... aber oft merkt man später, dass man doch nicht nur eine davon 
braucht
... oder umgekehrt, bei Sachen die es wirklich nur einmal im 
Universum/auf dem PC gibt, ist "einmal pro Prozess" zuviel.

C++, Zeitpunkt zu dem Konstruktoren laufen... schlimme Sache. Noch 
schlimmer wenn DLLs in Spiel kommen.

von Lothar (Gast)


Lesenswert?

Sebastian schrieb:
> Eine Variable mit globaler Sichtbarkeit hat immer auch globale
> Lebensdauer

Daher ist der Speicherbedarf beim Linken fix und bekannt. Lokale 
Variablen führen zu nicht-deterministischem Verhalten, insbesondere bei 
rekursiven Funktionen.

Sebastian schrieb:
> Lebensdauer: Es ist gefährlich, Funktionen, die auf Variablen mit
> globaler Lebensdauer zugreifen, aus mehreren Threads (bzw. ISRs, ...)
> aufzurufen

Eine globale Variable ist eine einmal vorhandene Ressource und wird 
genau so behandelt wie z.B. Register, also MUTEX u.ä. ISR mit lokalen 
Variablen sind hingegen wirklich gefährlich, auf einem Cortex-R mit 
Registerbänken kann dann noch der Stack gerettet werden, auf Cortex-M 
ist Ende im Hardfault.

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo Globus.

Globalus schrieb:

> Nur was mir wirklich nicht in den Kopf will, warum wird so gegen globale
> Variablen gewettert?
> Das Argument, dass von außen fremde Funktionen auf diese einwirken
> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist
> doch irgendwie konstruiert, denn letztenendes sind doch auch globale
> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm
> zugänglich...

Schon, aber es wird dann sehr schnell unübersichtlich, wenn das Programm 
größer wird.

> Der Verzicht auf globale Variablen wird dann durch Einführen von
> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der
> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner
> Ansicht nach zu weniger Transparenz führt...

Weil das ja auch nicht der offizielle Weg der OO Programmierung ist.
Der ist, beim Unterprogrammaufruf die betreffenden Variablen zu 
übergeben.

Es gibt nach meiner Ansicht aber seltene Ausnahmen:
Wenn Du ein Objekt direkt global anlegst, und alle Funktionen arbeiten 
daran herum, wie viele Bauarbeiter an einem großen Gebäude.
Aber auch das dürfte nur für kleinere bis mittlere Programme sinnvoll 
sein.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de

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.