Forum: Mikrocontroller und Digitale Elektronik globale Variablen


von global (Gast)


Lesenswert?

Hallo, eine kurze Frage zu dem Artikel: Globale Variablen

Zitat:
>Das extern bewirkt, dass für Global1 jetzt keine Variable
>mehr erzeugt wird. Es ist nur noch die Information,
>daß es irgendwo eine Variable namens Global1 gibt
>und das diese vom Typ int ist.
>Soweit so gut. Aber irgendwo muss diese Variable
>auch tatsächlich existieren, sonst könnte der Linker
>sie nicht finden, wenn er alle Einzelteile zu einem
>kompletten Programm zusammenbaut. Alle einzelnen *.c Dateien
>referenzieren sich ja nur noch auf eine Variable, die irgendwo
>anders erzeugt wird. *Nur wo?*

*Nur wo?*
Gibt es eine Festlegung, dass die Definition einer Variablen immer im 
main.c zu liegen hat, oder kann diese auch in irgendeiner anderen 
C-Datei liegen?

Gerade wenn man viele Daten-structs anlegen möchte, wäre es meiner 
Meinung nach sinnvoller, diese in einer Datei global.c anzulegen, 
anstatt alles vor der eigentlichen main-Funktion zu erledigen...

mfg

von Programmierer (Gast)


Lesenswert?

Nein, es gibt keine Festlegung. Du kannst solche globalen Variablen 
selbstverständlich in eine eigene Datei packen ... finde ich übrigens 
auch viel aufgeräumter so ...

Viel Spaß beim Programmieren.

von Oliver (Gast)


Lesenswert?

Noch schöner ist es natürlich, auf globale Variablen ganz zu verzichten, 
wo immer es geht.

Oliver

von public (Gast)


Lesenswert?

Servus,

globale Variablen lieber nicht benutzen, besser static Variable benutzen 
und eine get-Funktion schreiben.

So ist klar definiert das die Variable immer geholt und nie geschrieben 
wird.

Beste Grüße
public

von Daniel V. (danvet)


Lesenswert?

Bitte nicht "int i" global definieren! :-)
Ich habe schon ein Programm gesehen, bei dem "int i" global definiert 
war und andere *.c Files mit "extern int i" auf diese Variable 
zugegriffen haben.
Man glaubt es kaum...

von R2D2 (Gast)


Lesenswert?

public schrieb:
> So ist klar definiert das die Variable immer geholt und nie geschrieben
> wird.

Wenn sie aber nie geschrieben wird, dann ist es keine Variable, sondern 
eine Konstante :-)

von Daniel V. (danvet)


Lesenswert?

R2D2 schrieb:
> public schrieb:
>> So ist klar definiert das die Variable immer geholt und nie geschrieben
>> wird.
>
> Wenn sie aber nie geschrieben wird, dann ist es keine Variable, sondern
> eine Konstante :-)

naja, gemeint war wohl "versehentlich" geschrieben wird

von R2D2 (Gast)


Lesenswert?

Daniel V. schrieb:
>> public schrieb:
>>> So ist klar definiert das die Variable immer geholt und nie geschrieben
>>> wird.
>>
>> Wenn sie aber nie geschrieben wird, dann ist es keine Variable, sondern
>> eine Konstante :-)
>
> naja, gemeint war wohl "versehentlich" geschrieben wird

War schon klar :-)

Übrigens finde ich oft genug Code durchaus übersichtlicher, wenn 
Variablen global definiert werden, anstatt immer über Funktionen oder 
andere Hilfskonstrukte darauf zuzugreifen. Wenn eine Variable einen 
globalen Charakter hat, dann finde ich es nur konsequent, sie auch als 
global zu deklarieren. Nette Kommentare im Sourcecode tragen übrigens 
auch sehr zum Verständnis bei :-)

Just my 2 cents

von Reinhard Kern (Gast)


Lesenswert?

Oliver schrieb:
> Noch schöner ist es natürlich, auf globale Variablen ganz zu verzichten,
> wo immer es geht.

Das ist völliger Quatsch, besonders im Embedded Bereich. Es gibt keinen 
logischen Grund, warum für einen Temperaturregler die Temperatur nicht 
global sein soll.

Gruss Reinhard

von Oliver (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Oliver schrieb:
>> Noch schöner ist es natürlich, auf globale Variablen ganz zu verzichten,
>> wo immer es geht.
>
> Das ist völliger Quatsch,

Nun ja, man beachte den zweiten Halbsatz. Es gibt selten ein richtig 
oder falsch, wenn globale Variablen sinnvoll sind, warum nicht.

Es gibt aber durchaus Kontruktionen, die einem irgendwann auf die Füsse 
fallen. Und zwar garantiert.

Oliver

von Reinhard Kern (Gast)


Lesenswert?

Oliver schrieb:
> Es gibt aber durchaus Kontruktionen, die einem irgendwann auf die Füsse
> fallen. Und zwar garantiert.

Ja, zum Beispiel wenn man wegen solcher falschen Ratschläge alle 
Variablen mit mit new oder malloc erzeugt und mit Pointern auf sie 
zugreift - zwar cooler C-Stil, öffnet aber riesige Fehlermöglichkeiten, 
die völlig überflüssig sind.

Gruss Reinhard

von static (Gast)


Lesenswert?

public schrieb:
> So ist klar definiert das die Variable immer geholt und nie geschrieben
> wird.

... ausser jemand käme auf die Idee eine Set-Funktion zu schreiben!

von static (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Das ist völliger Quatsch, besonders im Embedded Bereich. Es gibt keinen
> logischen Grund, warum für einen Temperaturregler die Temperatur nicht
> global sein soll.

Mir erschliesst sich nicht, was das jetzt mit 
Temperaturregler/Temperatur zu tun haben soll.

"Logische" Gründe gibt es durchaus einige, z.B. zum einen der 
Kapselungsgedanke. Zum Anderen: Log mal deine Temperatur, wenn jeder, 
der Lust hat, direkt die Variable manipuliert.
Ich bin übrigens auch in der Embedded Ecke unterwegs und das nicht erst 
seit gestern. Auch in diesem Bereich ist durchaus ordentliche SW 
Architektur bzw. Design möglich!

von public (Gast)


Lesenswert?

Servus zusammen,

get- und set-Funktionen müssen natürlich konsequent für jede Variable 
geschrieben werden die in anderen *.c Files Verwendung finden. Sonst 
kann es, wie schon andere geschrieben haben, zu massig Seiteneffekten 
kommen.

Kaspelung ist DAS Stichwort. Zudem externe Variablen jedesmal neu 
deklariert werden müssen, Änderungen an den Variablennamen sind dann 
auch nicht mehr zulässig oder Enden in langen Abenden.

Die entsprechenden get- und set-Funktionen werden genau einmal 
geschrieben und können beliebig aufgerufen werden.

Für Konstanten würde ich eher ein Makro schreiben, aber dadrüber lässt 
sich natürlich auch diskutieren.

Wer es esotherisch mag, sollte globale Variablen benutzen :-)

Beste Grüße
public

von global (Gast)


Lesenswert?

na da habe ich ja eine Diskussion losgetreten...

Also ehrlich gesagt erschließt sich mir die generelle Angst vor globalen 
Variablen nicht.
Sobald die Namen eine einigermaßen eindeutige Bezeichnung besitzen und 
aus mehr als 5 Buchstaben bestehen, ist es doch fast ausgeschlossen, 
dass es zu unerwünschten Manipulationen kommt.

Im embedded-Bereich läuft auf einem Controller doch eh nur eine 
Software...

Da habe ich übrigens gleich eine Anschlussfrage:
Wenn ich (auf einem PC) zwei separate Programmprozesse habe, die über 
einen Scheduler sequenziell in Zeitschlitzen ablaufen, können gleiche 
globale Variablennamen dann über die jeweiligen main.c - Grenzen hinweg 
von dem jeweils anderen Programm verändert werden, oder bleiben globale 
Variablen innerhalb eines Programms begrenzt.

von Peter II (Gast)


Lesenswert?

global schrieb:
> Wenn ich (auf einem PC) zwei separate Programmprozesse habe,
was sind Programmprozesse? 2 Exe Dateien - also 2 Prozesse?

> von dem jeweils anderen Programm verändert werden, oder bleiben globale
> Variablen innerhalb eines Programms begrenzt.
jedes Programm bzw jeder Process hat seinen eigenen speicher. Dies kann 
man zwar mit linker optionen z.b bei DLLs anpassen aber das ist nicht 
der normalfall.

von public (Gast)


Lesenswert?

Kurze Frage:

Reden wir von Programmen die aus 2-3 *.c Files reden oder eher 10-20 
oder mehr??

Besten Gruß
public

von Karl H. (kbuchegg)


Lesenswert?

global schrieb:
> na da habe ich ja eine Diskussion losgetreten...
>
> Also ehrlich gesagt erschließt sich mir die generelle Angst vor globalen
> Variablen nicht.
> Sobald die Namen eine einigermaßen eindeutige Bezeichnung besitzen und
> aus mehr als 5 Buchstaben bestehen, ist es doch fast ausgeschlossen,
> dass es zu unerwünschten Manipulationen kommt.

Die Erfahrung der letzten 50 Jahre bei hinreichend großen Programmen 
sagt aber etwas anderes. Was bei einem Programm mit 200 Zeilen Code noch 
funktioniert, funktioniert bei 200-tausend Zeilen Code, 500 Funktionen 
und Aufrufhierarchien, die sich über 7, 8 Schachtelstufen hinziehen 
nicht mehr. Da dann noch zu überblicken, welcher Code wann welche 
globale Variable manipuliert, das entwickelt sich ganz schnell zu einem 
Albtraum. Das Zauberwort heißt dann 'Modulkapselung'. Ein Modul ist 
dafür zuständig, die Variablen zu verwalten. Dann hat man auch eine 
gemeinsame Anlaufstelle um im Debugger die Stellen zu finden, an denen 
sich der Status des Moduls verändert.
Was in einer kleinen Autowerkstatt mit 3 Angestellten funktioniert - 
jeder nimmt sich einfach das Werkzeug das er gerade braucht - 
funktioniert in Grossbetrieben nicht mehr. Da gibt es dann eine 
Werkzeugausgabe, die das Werkzeuglager kapselt und verwaltet.
In der Programmierung findet das ganze Konzept der objektorientierten 
Programmierung einen wesentlichen Grundpfeiler genau in dieser 
Problematik: Das Programme schneller in ihrer Komplexität mit der Größe 
wachsen als die Fähigkeiten der Programmierer das Gesamtsystem noch zu 
überblicken.

> Im embedded-Bereich läuft auf einem Controller doch eh nur eine
> Software...

Im Embedded Bereich macht man auf den kleinen AVR globale Variablen 
unter anderem auch deswegen, damit man eine aussagekräftige 
Speicherstatistik bekommt und abschätzen kann, in wie weit das SRAM 
ausgelastet ist.

von Reinhard Kern (Gast)


Lesenswert?

static schrieb:
> Log mal deine Temperatur, wenn jeder,
> der Lust hat, direkt die Variable manipuliert.

Karl Heinz Buchegger schrieb:
> Was bei einem Programm mit 200 Zeilen Code noch
> funktioniert, funktioniert bei 200-tausend Zeilen Code, 500 Funktionen
> und Aufrufhierarchien, die sich über 7, 8 Schachtelstufen hinziehen
> nicht mehr.

Eben, das ist der Unterschied. Wer um alles soll denn bei einem 
Temperaturregler für ein Aquarium die Temperatur manipulieren, wie von 
static befürchtet - die Fische? Und wieso soll sie eine nicht globale 
Variable davon abhalten, wenn man ihnen das schon zutraut?

Gruss Reinhard

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Kern schrieb:

> Eben, das ist der Unterschied. Wer um alles soll denn bei einem
> Temperaturregler für ein Aquarium die Temperatur manipulieren, wie von
> static befürchtet - die Fische? Und wieso soll sie eine nicht globale
> Variable davon abhalten, wenn man ihnen das schon zutraut?


Wie so oft gilt: "One size fits all" funktioniert bei Baseballkappen, 
aber das wars dann auch schon. Allgemeine Regeln und Aussagen ala "Das 
ist völliger Quatsch" sind nun mal problematisch. Auch wenn der Zusatz 
"besonders im Embedded Bereich" dann doch noch kommt.

von Reinhard Kern (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wie so oft gilt: "One size fits all" funktioniert bei Baseballkappen,
> aber das wars dann auch schon.

Und eben deshalb ist die hier immer wieder anzutreffende Aussage, man 
dürfe NIEMALS eine globale Variable verwenden, völliger Quatsch. Q.e.d.

Die von dir erwähnten 200000 Zeilen Code sind bei Embedded Controllern 
bisher eher nicht die Regel. Das Forum heisst doch Microcontroller, oder 
hat sich da was geändert Richtung Supercomputer? Ich glaube, den Leuten, 
die hier mit Problemen ankommen, dass ihre LEDs nicht blinken, nützt es 
nur wenig, wenn man ihnen ständig erklärt, wie sie mit einem Team von 
500 Programmierern ein Office-Paket entwickeln (überhaupt solltet Ihr 
das besser mal Microsoft klarmachen). Und ich sehe auch nicht ein, wieso 
ich eine Messschaltung für Lichtstärken oder pH-Werte unbedingt der 
reinen Lehre wegen multiuser- und multitaskingfähig machen muss. Schon 
mal was von KISS gehört? Das trägt mehr zur Fehlerfreiheit bei als alles 
Gequatsche über angeblich moderne Software-Managment-Methoden auf 
simplen Controllern für eine bestimmten, begrenzten Zweck.

Demnächst wird wohl den Anfängern erklärt, ein LED-Lauflicht müsste 
unbedingt als zertifizierter Managed Code mit .NET-Laufzeitumgebung 
entwickelt werden.

Gruss Reinhard

von amateur (Gast)


Lesenswert?

Also globale Variable immer, selten, nie, nicht, manchmal, wenn's gar 
nicht anders geht und bequemer ist, verwenden.

Als Name nicht "i" sondern möglichst "Jott" verwenden.

... sämtliche Klarheiten beseitigt!

Kapseln, ist das das was man seit neuestem in die Kaffeemaschine 
schiebt?

von Reinhard Kern (Gast)


Lesenswert?

amateur schrieb:
> ... sämtliche Klarheiten beseitigt!

Mit der einen Lehre kommt man halt in der Praxis nicht sehr weit. Ich 
hatte vor vielen Jahren schon einen Compiler mit strikter 
Objektorientierung - ein Bit war da ein Objekt mit Konstruktor, 
Destruktor, Setter und Getter- methoden und überladenenen Operatoren für 
Oder, Und usw., also ein richtiger Theorie-Traum. Aber völlig ungeeignet 
um einen 8051 zu programmieren.

Gruss Reinhard

von public (Gast)


Lesenswert?

Servus zusammen,

die Diskussion ist entartet, oder?

@Reinhard: 200000 Zeilen Code müssen kein Officepaket sein. Auch 
Mikrocontrolleranwendungen wachsen schnell in eine schwindelerregend 
hohe Codezeilenanzahl und dann zählt die Organisation des Codes. GV 
können hier sehr viel Schaden anrichten und den Code zusätzlich 
undurchsichtig machen.
Ich gebe dir natürlich recht, bei einem LED-Lauflicht ist das total 
wurscht.

Die Gefahr bei den GVs ist die Gewöhnung, also besser nicht dran 
gewöhnen globale Variablen zu verwenden, wenn man nicht weiß wie es 
eigentlich richtig geht. Eine schnelle Lösung ist halt nicht immer 
richtig.

Beste Grüße
public

von Tempo (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Eben, das ist der Unterschied. Wer um alles soll denn bei einem
> Temperaturregler für ein Aquarium die Temperatur manipulieren, wie von
> static befürchtet - die Fische? Und wieso soll sie eine nicht globale
> Variable davon abhalten, wenn man ihnen das schon zutraut?

Ich hoffe inständig, ihr macht in eurer Firma: RK elektronik GmbH keine 
SW macht ...
Da wollen einige Poster dem TO ein bisschen gutes SW Engineering 
beibringen und dann kommt der Chaos-Bastler Reinhard und mach alles 
zunichte.

Pfui - schäm dich!

von Tempo (Gast)


Lesenswert?

amateur schrieb:
> Kapseln, ist das das was man seit neuestem in die Kaffeemaschine
> schiebt

... und auch die ist inzwischen ein Embedded System mit jeder Menge SW.

von Tempo (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Die von dir erwähnten 200000 Zeilen Code sind bei Embedded Controllern
> bisher eher nicht die Regel.

Da kann ich aber nur lachen. Ich arbeite seit mehreren Jahrzehnten als 
SW Entwickler im Embedded Bereich und kann dir versichern, dass es eine 
Reihe von Systemen gibt, die diese Zeilenanzahl aber locker erreichen.

von Tippgeber (Gast)


Lesenswert?

Warum sich mit 10 Zeilen Code abfinden wenn es auch mit 1000 geht? In 
Zukunft wird die Programmgröße auch ein Instrument für die 
Marketingprofis werden, indem sich entsprechende Angaben in den 
Werbeprospekte gegenseitig überbieten. Kleine Controller werden dann 
dann nur noch ein Ziel für Hohn und Spott sein - wer hat den Kleinsten?

von Karl H. (kbuchegg)


Lesenswert?

Tippgeber schrieb:
> Warum sich mit 10 Zeilen Code abfinden wenn es auch mit 1000 geht?

Weil der Faktor nicht 1:100 ist, sondern wesentlich weniger. Und es 
sogar so ist dass er sich mit steigender Programmgröße ins genau 
Gegenteil dessen verkehrt, was du hier suggerierst.

Und weil es doch tatsächlich Programmierer gibt, die damit rechnen 
müssen, ihr Programm in den nächsten 10 Jahren noch in der Wartung zu 
haben und sich auch in 2, 3 oder 5 Jahren noch darin zurecht finden 
müssen ohne bei einer Erweiterung gleich erst mal alles zu zerstören.

von Tippgeber (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und weil es doch tatsächlich Programmierer gibt, die damit rechnen
>
> müssen, ihr Programm in den nächsten 10 Jahren noch in der Wartung zu
>
> haben

Schade, in 10 Jahren bin ich hoffentlich in Rente. Ich hoffe, dass meine 
digitale Komfortklospülung mir dann immer schön was vorsingt.

von Reinhard Kern (Gast)


Lesenswert?

Tempo schrieb:
> Chaos-Bastler Reinhard

Typisch Glaubenskrieger - weit und breit kein sachliches Argument, aber 
mit Beleidigungen nur so um sich werfen. Die meisten anderen führen hier 
wenigstens Gründe für ihre Meinung an, auch wenn ich nicht allen 
zustimmen kann, aber du betreibst nur das übliche substanzlose 
Shitstorming. Schade für das Forum hier, dass sich immer wieder jemand 
einmischen muss, der Pöbeln und Denken verwechselt.

Gruss Reinhard

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.