Eigener Namensbereich - Variablen



  • Moin!

    Wenn ich in die Variablen aus der Datei "header.h" Zahlen bzw Zeichen speichere
    (z.B. aus der Datei "FuncCReadFile.h") und anschließend in eine andere Funktion diese abrufen möchte, sind diese "leer" bzw sind die Daten weg.

    header.h

    #include <fstream>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    namespace OverFunc {
    
    	char CThousend[1000];
    	char CCryptThousand[1000];
    	char CTemp='0';
    	string SThousend[1000];
    	string STemp="0";
    	string FileIn="test.txt";
    	string FileOutA="outa.txt";
    	string FileOutB="outb.txt";
    	int ICryptThousand[1000];
    	int ITmp=0;
    	int ILoopMax=0;
    }
    

    main.cpp

    int main() {
    
    	FuncCReadFile();
    
    	FuncCrypt();
    
    	getchar();
    
    	return 0;
    
    }
    

    FuncCReadFile.h

    int FuncCReadFile() {
    	FILE *file;
    	char CTmp;
    	int TmpI=0;
    	int INumber=0;
    	file = fopen ("test.txt", "r");
    	if(file == NULL) {
    		printf("Datei konnte nicht geoeffnet werden.\n");
    	} else {
    		OverFunc::ILoopMax=0;
    		while((TmpI = fgetc(file))!=EOF) {
    			printf("%c", TmpI);
    			printf("\n");
    			printf("%i", TmpI);
    			printf("\n");
    			OverFunc::IThousend[OverFunc::ITmp] = TmpI;
    			printf("%c", OverFunc::IThousend[OverFunc::ILoopMax]);
    			printf("\n");
    			printf("%i", OverFunc::IThousend[OverFunc::ILoopMax]);
    			printf("\n");
    			++OverFunc::ILoopMax;
    		}
    	}
    	fclose (file);
    }
    

    (Da ich die Variablen in die eigene Namensbereich speichere, müssten diese doch noch im Speicher sein, oder? 😕 )

    Danke



  • freddy krüger schrieb:

    Da ich die Variablen in die eigene Namensbereich speichere, müssten diese doch noch im Speicher sein, oder? 😕

    Was heisst "noch im Speicher"? Was hat das mit Namensräumen zu tun?

    Du verletzt die ODR ( one definition rule ). Grundsätzlich solltest du den Gebrauch globaler überdenken!



  • Danke für diesen Hinweis.

    Wenn ich den Funktionen Parameter übergebe, müsen doch in dem main Block die entsprechenden Variable schon bekannt sein. (oder schon vor der main)

    Dann wäre die Möglichkeit per return Befehl die abgespeicherten Werte zurück zu liefern.

    Wären die Variablen die vor dem Aufruf der Funktionen, in dem main Block bzw (es dient nur der Frage) davor "bekannt" gibt, nicht global? 😕



  • freddy krüger schrieb:

    Wenn ich den Funktionen Parameter übergebe, müsen doch in dem main Block die entsprechenden Variable schon bekannt sein. (oder schon vor der main)

    Wenn du Parameter übergibst (du tust es nicht!), müssen sie an der aufrufenden Stelle bekannt sein. Sie können eine Zeile vorher definiert worde sein

    freddy krüger schrieb:

    Dann wäre die Möglichkeit per return Befehl die abgespeicherten Werte zurück zu liefern.

    Man kann Parameter so übergeben, dass sie geändert werden können. Man kann Werte aus einer Funktion zurückgeben.

    Keine Ahnung was "die abgespeicherten Werte" sein soll.

    Wären die Variablen die vor dem Aufruf der Funktionen, in dem main Block bzw (es dient nur der Frage) davor "bekannt" gibt, nicht global? 😕

    Nein, warum sollten sie?



  • Wenn ich folgendes Programm (siehe Quellcode unten) ausführe, wird anstelle des Wertes "3" eine "0" angezeigt.

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "FuncA.c"
    #include "FuncB.c"
    
    int main() {
    	int g;
    	FuncA(g);
    	FuncB(g);
    	return 0;
    }
    

    FuncA.c

    int FuncA(int abc) {
    	printf("%i", abc);
    	printf("\n");
    	abc=3;
    	printf("%i", abc);
    	printf("\n");
    	return abc;
    }
    

    FuncB.c

    int FuncB(int def) {
    	printf("%i", def);
    	printf("\n");
    	return def;
    }
    

    Weiß jemand woran es liegt ? 😕



  • Ja, Stichwort Call-by-Value.



  • Nathan schrieb:

    Ja, Stichwort Call-by-Value.

    WIe kann ich dies "lösen" bzw es hinbekommen, dass in der "FuncB" Funktion der Wert "3" angezeigt wird?

    (ohne globale Variablen)

    Irgendwie stehe ich gerade auf dem Schlauch.





  • Call by reference

    void f(int& val)
    


  • manni66 schrieb:

    Call by reference

    void f(int& val)
    

    Gibt es dies auch in C?

    Der Compiler (Orwell DevC++) zeigt mir bei dem Code

    void FuncA(int& abc) {
    	printf("%i", abc);
    	printf("\n");
    	abc=3;
    	printf("%i", abc);
    	printf("\n");
    }
    

    Folgenden Fehler an: [Error] expected ';', ',' or ')' before '&' token



  • Nein, ein C brauchste Pointer.
    Aber wieso auf einmal C?



  • freddy krüger schrieb:

    Gibt es dies auch in C?

    Also mir reicht deine Dummheit jetzt.


Anmelden zum Antworten