Hallo an alle,
schon wieder ich, auch wenn noch kein halbes Jahr rum ist, dafür ist die Frage vermutlich wirklich dumm
Nach allem was ich so gelesen habe, soll man keine globalen Variablem verwenden, um gleiche Variablennamen in verschiedenen Funktionen verwenden zu können
Sämtliche Beispiele in Anfängertutorials sind natürlich auch immer so geschrieben, dass es ohne globals geht, aber immer wenn ich versuche einen Schritt weiter zu denken um meinen Lernfortschritt aus den Lektionen zu prüfen komme ich wieder ans gleiche Problem
Ich tendiere nahezu automatisch dazu globals zu verwenden, weils einfach praktisch ist und ich es von php her gewohnt bin, nur ist der ganze Aufbau von C (und erst recht bei C++) auf die Verwendung von lokalen Variablen ausgelegt, so dass ich immer gleich daran erinnert werde doch lieber keine globals zu verwenden
Der Sinn der Sache ist mir durchaus klar, nur bleiben mir da einige Fragen offen
1) Wenn ich zum Beispiel eine Datei habe in der Konstanten für verschiedene Funktionen gespeichert sind, etwa eine Liste mit Namen oder sowas, dann muss ich ohne globals jedesmal wenn ich in einer Funktion einen Namen aus der Liste brauche die Datei neu einlesen, strings splitten usw, bis ich den gesuchten Namen gefunden habe
Klar, dazu schreibe ich eine subroutine, die das ausliest, im code also schön kurz und übersichtlich, aber für den Rechner eine Unmenge an Lesezugriffen auf die Festplatte, während ein globales array hier bei Programmstart einfach alle Namen lesen könnte und ab sofort allen Funktionen die Liste zur Verfügung steht
Sinn also klar, aber kann mir einer erklären, wie ich später mal, wenn ich grosse Anwendungen schreibe, vermeide, dass die Geschwindigkeit in die Knie geht?
Lies 1000 mal die gleiche Datei, nur damit ich keine globals verwenden muss macht bei allem Verständnis für Vermeidung von Bugs für mich irgendwie trotzdem keinen Sinn
2) Was mir absolut nicht in den Kopf will, egal wie oft ich es nochmal lese ist die Sache mit dem Austausch von Variablen beim Aufruf einer Funktion
Scheint auch in Verbindung mit meiner php Vorbelastung zu stehen, bzw auch dabei will ich ständig globals verwenden, weil ich nicht kapiere, wie rum da nun Variablen bzw deren Werte übergeben werden und welche Variable überhaupt an welcher Stelle zur Verfügung steht, bzw. wie ich an den Wert einer Variablen komme, die nicht innerhalb der Funktion definiert wurde und auch nicht global ist
Ich weiss nicht mal ob ich das Problem verständlich erklären kann, bis jetzt probiere ich unglaublich viel herum, wenn ich etwas nicht weiss, dann nach dem Motto Versuch macht klug, aber ich würde zu gerne den Vorgang dahinter verstehen, damit ich nicht jedesmal bei der kleinsten Änderung im Script wieder ausprobieren muss, ob der Wert meiner Variablen denn noch gültig ist, bzw noch darauf zugegriffen werden kann, nachdem ich zwischen Erstellen der Variablen und nächster Verwendung ein paar [{}] verwendet habe, oder wissen muss ob meine nächste Funktion die Variable überhaupt kennt
3) Falls die ersten 2 noch nicht dumm genug waren, richtig dämlich stelle ich mich an, wenn ich in jeder zweiten Zeile etwas von memory leaks und deren Vermeidung lese, das wird in sämtlichen Kursen derartig oft wiederholt, da passe ich ganz fein auf, dass ich mir das von Anfang an richtig angewöhne, nur begreife ich nicht, was ich wann wie löschen befreien oder sonstwas damit machen muss
char buffer[50]
free(buffer)
Klar, das kann ich mir überall nachlesen, nur sagt mir keiner dazu, was macht denn "free"? Leert den buffer? Oder löscht ihn ganz?
Was ist mit Variablen? Wenn eine Variable definiert wird
int i = 1
und dies innerhalb einer Funktion 1000 mal läuft, habe ich dann nicht 1000 i´s alle mit dem gleichen Wert, muss ich die nach Gebrauch nicht wieder löschen, oder was?
Gerade im Moment hänge ich bei einem mehrdimensionalen array
char buffer[10][10][10]
Was ich damit machen kann ist mir klar, aber ob ich da auch
free(buffer)
verwenden kann? Keine Ahnung! Steht auch im Tutorial nicht dabei, ist auch nicht besonders wichtig in Übungen die kaum mal mehr als 2 Funktionen haben und nur 2 oder 3 mal durchlaufen, aber wenn schon, dann will ich das von Anfang an so machen, dass ich später weiss wie es geht
4) Komplett im Wald stehe ich dann, wenn es um verschiedene Typen, oder nur verschiedene Schreibweisen des gleichen Typs geht
char buffer
char* buffer
char buffer[10]
char buffer[]
char buffer*
da fassen sich selbst die einfachsten Anfänger Tutorials derartig kurz, dass ich mir einfach keine Eselsbrücke bauen kann, mit der ich mir mal merken könnte, was denn nun was bedeutet, da schlage ich 100 mal am Tag nach, jedesmal wenn in einer Übung sowas auftaucht (und wenn ich mal nicht nachschlage, dann bekomme ich unter garantie eine fehlermeldung ala invalid conversion) selbst das Video "Thinking in C" von Bruce Eckel sagt dazu sinngemäss soviel wie "da wollen wir jetzt gar nicht so tief einsteigen", aber bitte wie soll ich es denn begreifen, wenn es nicht mal in den einfachsten Anfängertutorials beschrieben wird
Ich wäre dankbar wenn jemand mir mal diese Grundbegriffe für ganz Dumme erklären könnte
schon wieder ich, auch wenn noch kein halbes Jahr rum ist, dafür ist die Frage vermutlich wirklich dumm
Nach allem was ich so gelesen habe, soll man keine globalen Variablem verwenden, um gleiche Variablennamen in verschiedenen Funktionen verwenden zu können
Sämtliche Beispiele in Anfängertutorials sind natürlich auch immer so geschrieben, dass es ohne globals geht, aber immer wenn ich versuche einen Schritt weiter zu denken um meinen Lernfortschritt aus den Lektionen zu prüfen komme ich wieder ans gleiche Problem
Ich tendiere nahezu automatisch dazu globals zu verwenden, weils einfach praktisch ist und ich es von php her gewohnt bin, nur ist der ganze Aufbau von C (und erst recht bei C++) auf die Verwendung von lokalen Variablen ausgelegt, so dass ich immer gleich daran erinnert werde doch lieber keine globals zu verwenden
Der Sinn der Sache ist mir durchaus klar, nur bleiben mir da einige Fragen offen
1) Wenn ich zum Beispiel eine Datei habe in der Konstanten für verschiedene Funktionen gespeichert sind, etwa eine Liste mit Namen oder sowas, dann muss ich ohne globals jedesmal wenn ich in einer Funktion einen Namen aus der Liste brauche die Datei neu einlesen, strings splitten usw, bis ich den gesuchten Namen gefunden habe
Klar, dazu schreibe ich eine subroutine, die das ausliest, im code also schön kurz und übersichtlich, aber für den Rechner eine Unmenge an Lesezugriffen auf die Festplatte, während ein globales array hier bei Programmstart einfach alle Namen lesen könnte und ab sofort allen Funktionen die Liste zur Verfügung steht
Sinn also klar, aber kann mir einer erklären, wie ich später mal, wenn ich grosse Anwendungen schreibe, vermeide, dass die Geschwindigkeit in die Knie geht?
Lies 1000 mal die gleiche Datei, nur damit ich keine globals verwenden muss macht bei allem Verständnis für Vermeidung von Bugs für mich irgendwie trotzdem keinen Sinn
2) Was mir absolut nicht in den Kopf will, egal wie oft ich es nochmal lese ist die Sache mit dem Austausch von Variablen beim Aufruf einer Funktion
Scheint auch in Verbindung mit meiner php Vorbelastung zu stehen, bzw auch dabei will ich ständig globals verwenden, weil ich nicht kapiere, wie rum da nun Variablen bzw deren Werte übergeben werden und welche Variable überhaupt an welcher Stelle zur Verfügung steht, bzw. wie ich an den Wert einer Variablen komme, die nicht innerhalb der Funktion definiert wurde und auch nicht global ist
Ich weiss nicht mal ob ich das Problem verständlich erklären kann, bis jetzt probiere ich unglaublich viel herum, wenn ich etwas nicht weiss, dann nach dem Motto Versuch macht klug, aber ich würde zu gerne den Vorgang dahinter verstehen, damit ich nicht jedesmal bei der kleinsten Änderung im Script wieder ausprobieren muss, ob der Wert meiner Variablen denn noch gültig ist, bzw noch darauf zugegriffen werden kann, nachdem ich zwischen Erstellen der Variablen und nächster Verwendung ein paar [{}] verwendet habe, oder wissen muss ob meine nächste Funktion die Variable überhaupt kennt
3) Falls die ersten 2 noch nicht dumm genug waren, richtig dämlich stelle ich mich an, wenn ich in jeder zweiten Zeile etwas von memory leaks und deren Vermeidung lese, das wird in sämtlichen Kursen derartig oft wiederholt, da passe ich ganz fein auf, dass ich mir das von Anfang an richtig angewöhne, nur begreife ich nicht, was ich wann wie löschen befreien oder sonstwas damit machen muss
char buffer[50]
free(buffer)
Klar, das kann ich mir überall nachlesen, nur sagt mir keiner dazu, was macht denn "free"? Leert den buffer? Oder löscht ihn ganz?
Was ist mit Variablen? Wenn eine Variable definiert wird
int i = 1
und dies innerhalb einer Funktion 1000 mal läuft, habe ich dann nicht 1000 i´s alle mit dem gleichen Wert, muss ich die nach Gebrauch nicht wieder löschen, oder was?
Gerade im Moment hänge ich bei einem mehrdimensionalen array
char buffer[10][10][10]
Was ich damit machen kann ist mir klar, aber ob ich da auch
free(buffer)
verwenden kann? Keine Ahnung! Steht auch im Tutorial nicht dabei, ist auch nicht besonders wichtig in Übungen die kaum mal mehr als 2 Funktionen haben und nur 2 oder 3 mal durchlaufen, aber wenn schon, dann will ich das von Anfang an so machen, dass ich später weiss wie es geht
4) Komplett im Wald stehe ich dann, wenn es um verschiedene Typen, oder nur verschiedene Schreibweisen des gleichen Typs geht
char buffer
char* buffer
char buffer[10]
char buffer[]
char buffer*
da fassen sich selbst die einfachsten Anfänger Tutorials derartig kurz, dass ich mir einfach keine Eselsbrücke bauen kann, mit der ich mir mal merken könnte, was denn nun was bedeutet, da schlage ich 100 mal am Tag nach, jedesmal wenn in einer Übung sowas auftaucht (und wenn ich mal nicht nachschlage, dann bekomme ich unter garantie eine fehlermeldung ala invalid conversion) selbst das Video "Thinking in C" von Bruce Eckel sagt dazu sinngemäss soviel wie "da wollen wir jetzt gar nicht so tief einsteigen", aber bitte wie soll ich es denn begreifen, wenn es nicht mal in den einfachsten Anfängertutorials beschrieben wird
Ich wäre dankbar wenn jemand mir mal diese Grundbegriffe für ganz Dumme erklären könnte