Header und Quelldateien und externe Variablen

Schnelle objektorientierte, kompilierende Programmiersprache.
forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Header und Quelldateien und externe Variablen

Beitrag von forumnewbie » So Mär 24, 2013 8:31 pm

Hi,

der Sinn von diesem kleinen Experiment war, zu sehen wie externe Variablen funktionieren, wenn ein Projekt aus mehreren Dateien besteht. Ich habe mir dazu irgend eine Funktion ausgedacht, die irgendwas machen soll.
Ich ändere in der main-Funktion die Werte von meinen externen Variablen A und B und kann auf diese Werte innerhalb einer anderen Datei zugreifen und damit weiter rechnen. Mehr wollte ich mit diesem Beispiel nicht machen :).

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: Header und Quelldateien und externe Variablen

Beitrag von GilbertDur » Mo Mär 25, 2013 8:39 am

Ach so. Gut zu wissen. Das erklärt natürlich einiges :D

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Header und Quelldateien und externe Variablen

Beitrag von Xin » Mo Mär 25, 2013 1:30 pm

forumnewbie hat geschrieben:Das ist ein Experiment. In dem Buch, was ich gerade lese, wird erwähnt, dass es so etwas gibt. Aber dort steht auch, dass man darauf verzichten sollte und es gibt dazu deshalb auch kein Beispiel. Ich bin neugierig und wollte sehen wie das funktioniert.
Ich hoffe in dem Buch steht auch, warum man das nicht machen soll.

Ansonsten finde ich es gut, dass Du es ausprobierst, mir ist jeder Entwickler lieber, der weiß, warum er Dinge nicht tut, als jemand, der weiß, was er nicht tun soll. Manchmal muss man nämlich "böse" Dinge tun, dann kann sich der Böse durchs Minenfeld bewegen und der Brave explodiert... Brav sein wird halt nicht immer belohnt. :->
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Header und Quelldateien und externe Variablen

Beitrag von forumnewbie » Mo Mär 25, 2013 6:39 pm

So sehe ich das auch. Man muss nicht nur wissen, dass man etwas nicht machen darf/sollte, sondern auch genau verstehen warum bzw. welche Konsequenzen es haben kann.

Wenn ich das richtig verstanden habe, sollte man auf externe/globale Variablen verzichten, weil in einem großen Projekt, an dem mehrere Leute arbeiten, passieren kann, dass ein anderer Programmierer unabsichtlich oder absichtlich den Wert einer globalen Variable ändert. Diese Variable benutzt jedoch ein anderer Programmierer für seine Zwecke und rechnet nicht damit, dass jemand die Werte dieser globalen Variable ändert. Somit entsteht ein Laufzeitfehler im Projekt, der dann meistens sehr schwer zu finden ist.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Header und Quelldateien und externe Variablen

Beitrag von Xin » Mo Mär 25, 2013 6:51 pm

forumnewbie hat geschrieben:Wenn ich das richtig verstanden habe, sollte man auf externe/globale Variablen verzichten, weil in einem großen Projekt, an dem mehrere Leute arbeiten, passieren kann, dass ein anderer Programmierer unabsichtlich oder absichtlich den Wert einer globalen Variable ändert. Diese Variable benutzt jedoch ein anderer Programmierer für seine Zwecke und rechnet nicht damit, dass jemand die Werte dieser globalen Variable ändert. Somit entsteht ein Laufzeitfehler im Projekt, der dann meistens sehr schwer zu finden ist.
Das ist ein möglicher Grund - und kein schlechter.

Globale Variablen sind global. Funktionen sollen Probleme aber verkleinern, also eben nicht global agieren, sondern nur eine kleine, begrenzte Aufgabe übernehmen. Die Ausgabe eine Funktion sollte reproduzierbar sein, dafür ist es wichtig, dass man die Werte kennt, die für die Berechnung verwendet werden. Je überschaubarer das ist, umso besser und desto leichter zu testen.

Globale Variablen sollten also nur aus einem von zwei Gründen verwendet werden: Es handelt sich um global zugängliche Informationen oder das Programm wird so optimiert, dass es begrenzte Probleme extrem schnell sein muss. Das ist aber keine Aufgabe für einen Einsteiger.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Header und Quelldateien und externe Variablen

Beitrag von forumnewbie » Mo Mär 25, 2013 7:00 pm

Den Geschwindigkeitsvorteil von globalen Variablen hat er erwähnt, da dort auf den Stack nichts kopiert werden muss (wenn ich es richtig verstanden habe).
Er hat aber geschrieben, dass man die Geschwindigkeit bei Funktionen aus wenig Quellcode mit dem Schlüsselwort "inline" (Textersetzung) optimieren kann, so dass der Geschwindigkeitsunterschied zu globalen Variablen kaum noch messbar ist.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Header und Quelldateien und externe Variablen

Beitrag von Xin » Mo Mär 25, 2013 9:25 pm

forumnewbie hat geschrieben:Den Geschwindigkeitsvorteil von globalen Variablen hat er erwähnt, da dort auf den Stack nichts kopiert werden muss (wenn ich es richtig verstanden habe).
Er hat aber geschrieben, dass man die Geschwindigkeit bei Funktionen aus wenig Quellcode mit dem Schlüsselwort "inline" (Textersetzung) optimieren kann, so dass der Geschwindigkeitsunterschied zu globalen Variablen kaum noch messbar ist.
inline FUNKTIONEN haben nichts mit globalen VARIABLEN zu tun.

Du sprichst von vermutlich von Memberfunktionen und Membervariablen, wobei Membervariablen definitiv alles andere als global sind.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Header und Quelldateien und externe Variablen

Beitrag von forumnewbie » Mo Mär 25, 2013 10:46 pm

Ich meinte, dass man globale Variablen ohne Funktionen ändern und benutzen kann. Ohne globale Variablen müsste man mit Funktionen arbeiten, die dann Variablen manipulieren können. Das bedeutet aber mehr Rechenaufwand, da bei jedem Aufruf der Funktionen der Stack in Anspruch genommen und verzweigt wird. Der Compiler erzeugt nur einmal den Assembler-Code für diese Funktionen und springt bei jedem Aufruf mithilfe von Stack an diese Stellen. Und mit inline kann man das Springen verhindern, da der Compiler an den Stellen, wo die Funktionen aufgerufen werden, den kompletten Assembler-Code jedes Mal nochmal kopiert. Dadurch kann man das Programm schneller machen, ohne dass man dafür globale Variablen verwenden muss.

So habe ich das zumindest verstanden.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Header und Quelldateien und externe Variablen

Beitrag von cloidnerux » Mo Mär 25, 2013 11:12 pm

Ich meinte, dass man globale Variablen ohne Funktionen ändern und benutzen kann.
Code liegt immer in Funktionen, selbst die Main ist eine Funktion. Was du meinst ist die Tatsache, dass man eine globale Variable nicht als Funktionsargument mit übergeben musst, da es ja global Definiert ist.
Das bedeutet aber mehr Rechenaufwand, da bei jedem Aufruf der Funktionen der Stack in Anspruch genommen und verzweigt wird
Hier entsteht kein Rechenaufwand in dem sinne, es entsteht Aufwand deine Funktion aufzurufen. Wobei hier das ganze schon wieder etwas verschwimmt, weil moderne Compiler hier mitunter sehr gut Optimieren.
Dadurch kann man das Programm schneller machen, ohne dass man dafür globale Variablen verwenden muss.
Von der Theorie her richtig, in der Praxis aber nicht eindeutig. Wie gesagt, Compiler sind mitunter sehr intelligent und können entsprechend Funktionen als inline behandeln, die so aber nicht deklariert waren. Mit dem angeben von inline zwingst du den Compiler aber dazu, dies zu machen, musst dafür aber wissen, ob dir das wirklich hilft.

Eine globale Variable erspart dir das übergeben per Pointer, es ermöglicht dir aber nicht mehr Kontrolle darüber zu haben, an welchen stellen es verändert wird.
Und dann gibt es da noch die praktische Betrachtung, ob das kopieren von einem Pointer auf den Stack so viel mehr Zeit kostet im vergleich zu der Ausführung der Funktion, sodass es sich lohnt globale Variablen zu nutzen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten