Lokale Variable in einer anderen Funktion benutzen?
lima-city → Forum → Programmiersprachen → C/C++ und D
anfang
array
code
dank
definieren
deklaration
file
funktion
kopie
krieg
methode
null
objekt
parameter
problem
richtig verwenden
variable code
versuch
verwenden
warnung
-
Ich hab folgendes Problem:
Ich hab ein struct array das mit
am anfang einer Header Datei definiert ist.const Object Objects[];
In der "main Datei" wird dann eine Funktion aufgerufen und die ruft dann eine Weitere auf die den Array füllt.
Wenn ich dann verusche das Array in einer weiteren Funktion aufzurufen wird z.B. mit printf() nur "(null)" ausgegeben.
1. Weiß ich (wieder (-; ) nicht woran das liegt
2. Wie kann man das lösen oder (wie ich es zuerst machen wollte) die Variable "Objects" in der ersten Funktion definieren und dann Global machen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hm... ein bisschen Code wär nicht schlecht.
const ist übrigens keine so gute Wahl bei der Deklaration. Damit kannst du die Objekte nicht noch mal ändern und müsstest diese
auch direkt bei der Deklaration initialisieren!
Versuchs mal mit static (bedeutet soviel wie: bleibt so lange gültig, wie das Programm läuft. Heißt nicht, dass die Variable statisch und somit nicht änderbar ist!)
Evtl. hast du dein 'globales' Array gar nicht gefüllt, sonder nur irgendeine lokale Kopie davon. Was dann erklären würde, warum immer noch null rauskommt.
Wenn du eine Variable global haben willst, dann musst du diese von anfang an als global definieren. Man kann keine Variable in einer Funktion definieren und dann global machen (kenne zumindest keine solche möglichkeit, macht auch wenig sinn).
Aber wie gesagt, mit etwas Code von dir, kann man dir evtl. besser helfen...
-
tangoal schrieb:
Hm... ein bisschen Code wär nicht schlecht.
const ist übrigens keine so gute Wahl bei der Deklaration. Damit kannst du die Objekte nicht noch mal ändern und müsstest diese
auch direkt bei der Deklaration initialisieren!
Versuchs mal mit static (bedeutet soviel wie: bleibt so lange gültig, wie das Programm läuft. Heißt nicht, dass die Variable statisch und somit nicht änderbar ist!)
Evtl. hast du dein 'globales' Array gar nicht gefüllt, sonder nur irgendeine lokale Kopie davon. Was dann erklären würde, warum immer noch null rauskommt.
Wenn du eine Variable global haben willst, dann musst du diese von anfang an als global definieren. Man kann keine Variable in einer Funktion definieren und dann global machen (kenne zumindest keine solche möglichkeit, macht auch wenig sinn).
Aber wie gesagt, mit etwas Code von dir, kann man dir evtl. besser helfen...
Der Code ist (schon) ziemlich lang weswegen ich ich ihn nicht komplett posten möchte aber hier zumindest die wichtigen Funktionsparamter:
... static Object Objects[100]; ... void ParseFile(char * File, Object object) { ... object.Name = Name; // Beispiel für das setzen von Werten bei dem Object in der Funktion ... } void FileLoader(char ** Files) { ... while (i < FilesLen) { // FilesLen: länge des Dateinamen Arrays ParseFile(Files[i], Objects[i]); i++; } printf("%s\n", Objects[0].Name);
Ergenis des Codes:
(null)
-
Hm, joah, sieht man, dass du nur Skriptsprachen kennst, die alles implizit schon so machen, wie man es möchte.
Aber C++ ist anders:
Dem Funktionsaufruf von ParseFile übergibst du nur eine Kopie deines Objektes! Eine Kopie ist keine Referenz! (Der Kopierkonstruktor wird dafür aufgerufen, evtl. müsstest du diesen evtl. überschreiben, wenn du deine eigenen Klassen nutzt, ist aber erstmal nicht von Nöten, denke ich).
Das bedeutet, du nimmst Änderungen in einem kopierten Objekt vor, ohne die Änderungen in dein Original-Objekt zu übernehmen.
Am leichtesten könntest du es lösen, in dem du die Funktion folgendermaßen änderst:
Object ParseFile(char *File) { Object obj; obj.name = "Name..."; ... return obj; }
Du erstellst innerhalb der Funktion ein Objekt und füllst es mit deinen relevanten Daten. Am Ende der Funktion gibst du es zurück.
Das Objekt übernimmst du dann irgendwie so:
for (int i = 0; i < 100; i++) Object[i] = ParseFile(Files[i]);
Evtl. ist das nicht der einzige Fehler... aber ändere das erstmal so... das mit der 'globalen' Deklaration des Arrays gefällt mir auch nicht so... aber ich bin halt kein Compiler und wenn der das durchgehen lässt, dann ist das schon mal gut^^
Beitrag zuletzt geändert: 20.10.2010 23:03:15 von tangoal -
Ok, danke das hat jetzt schon mal funktioniert jetzt habe ich aber ein neues problem denn wie kann ich das "Object" Array das momentan global definiert ist in irgedneiner anderen Funktion verwenden den bei deiner Methode kann ich zwar den Array in der Funktion in der sie verwendet wird (FileLoader) richtig verwenden aber außerhalb also in jeder anderen Funktion kommt nur "schman" raus. "Objects" von "FileLoader" "returnen" zu lassen krieg ich auch nicht hin: )-:
warning: function returns address of local variable
-
krisi12345 schrieb: Ok, danke das hat jetzt schon mal funktioniert jetzt habe ich aber ein neues problem denn wie kann ich das "Object" Array das momentan global definiert ist in irgedneiner anderen Funktion verwenden den bei deiner Methode kann ich zwar den Array in der Funktion in der sie verwendet wird (FileLoader) richtig verwenden aber außerhalb also in jeder anderen Funktion kommt nur "schman" raus. "Objects" von "FileLoader" "returnen" zu lassen krieg ich auch nicht hin: )-:
Hm, du verwendest es einfach so, wie du es in der Funktion FileLoader verwendest. Mit FileLoader brauchst du nichts zurückzugeben... das Array ist ja "global", also kannst du es überall nutzen.
warning: function returns address of local variable
Wo tritt den diese Warnung auf? Versuchst du das Array in FileLoader zurückzugeben?
-
tangoal schrieb:
krisi12345 schrieb: Ok, danke das hat jetzt schon mal funktioniert jetzt habe ich aber ein neues problem denn wie kann ich das "Object" Array das momentan global definiert ist in irgedneiner anderen Funktion verwenden den bei deiner Methode kann ich zwar den Array in der Funktion in der sie verwendet wird (FileLoader) richtig verwenden aber außerhalb also in jeder anderen Funktion kommt nur "schman" raus. "Objects" von "FileLoader" "returnen" zu lassen krieg ich auch nicht hin: )-:
Hm, du verwendest es einfach so, wie du es in der Funktion FileLoader verwendest. Mit FileLoader brauchst du nichts zurückzugeben... das Array ist ja "global", also kannst du es überall nutzen.
warning: function returns address of local variable
Wo tritt den diese Warnung auf? Versuchst du das Array in FileLoader zurückzugeben?
Ich hab ja versucht "Objects" was eigentlich global ist in einer anderen Funktion zu verwenden aber da kommt nur schman als ausgabe die anscheinend noch von anderen Variablen beeinflusst wird!?
Beispiel für die ausgaben:
F�l H�
oder beim nächsten programmstart
J �
Und diese Warnung trat auf als ich veruscht hab den struct array (Objects) mit return in einer variable zu speichern.
Beitrag zuletzt geändert: 21.10.2010 21:34:23 von krisi12345 -
Hm also so wie ich das sehe ist erstmal das Problem,
dass du in ParseFile offensichtlich die lokale Variable Objects zurückgeben lässt, was zu Fehlern führt.
Lokale Variablen sind nur innerhalb der Funktionen definiert und werden nach dem Funktionsaufruf wieder gelöscht und für die Variablen anderer Funktionen verwendet (außer du definierst sie als static, was dazu führt, dass ihr Wert erhalten bleibt).
Generell kann ich dir nur sagen, dass es schlechter Stil ist eine globale Variable zu verwenden, da sowas schnell unübersichtlich wird.
Besser wäre es die fraglichen Daten immer als Parameter an die Funktion zu übergeben.
Insofern war dein erster Ansatz nicht unbedingt schlecht.
Das Problem daran war lediglich, dass du den Parameter per Copy-by-Value übergeben hast, was bedeutet, dass in deiner Funktion
eine Kopie dessen was du übergeben hast angelegt wurde und du diese Kopie bearbeitet hast. Die Änderungen wirkten sich also nicht auf das Original aus.
Um das zu erreichen, musst du Copy-by-Reference verwenden, was bedeutet, dass du den Parameter als Referenz übergibst:
void ParseFile(char * File, Object& object)
Damit wird jede Änderung, die du an object vornimmst, direkt am Übergebenen Object durchgeführt und nicht an einer Kopie.
Beitrag zuletzt geändert: 22.10.2010 16:24:20 von sektor -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage