[Gelöst]OOP Globale Variable und mehrere Datein.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Gelöst]OOP Globale Variable und mehrere Datein.

    Hallo zusammen :)

    Kann mir jemand sagen, wie ich Globale Variablen in mehreren Dateien verwenden kann ?
    Als ich noch in einer Datei alleine Programmiert habe gab es kein Problem mit den Globalen Variablen und
    den Zugriff auf diesen. Wenn ich aber nun auf eine im "main.cpp" Hauptprogramm initialisierte Variable von einer
    anderen Datei aus zugreifen will funktioniert das nicht und der Compiler gibt mir an die Variable
    sei nicht in "Andere_ Datei.cpp" deklariert.

    Nun habe ich mir gedacht "Kein Problem, ich erstelle einfach einen Header der das ganze Globale Zeugs aufnimmt"
    und habe diesen auch erstellt und in "main.cpp" und auch in "Andere_Datei.cpp" eingefügt.

    Nun bekomme ich aber trotzdem in meinen Testprogramm immer einen Fehler.

    /home/lecramos/Programmieren/#HalloWelt/TestGlobal/main.cpp|9|undefined reference to `funktion()'|

    Kann mir bitte jemand helfen und mir erklären, wie man mit den Globalen
    Variablen auf mehreren Dateien umzugehen hat ?

    TESTPROG.

    Datei: main.cpp

    Code:

    Quellcode

    1. #include <iostream>
    2. using namespace std ;
    3. #include "Globale_Var.h"
    4. #include "funktion.h"
    5. int main(void) {
    6. funktion() ;
    7. cout << a+b+c << endl ;
    8. return 0 ;
    9. }
    Alles anzeigen


    Datei: funktion.cpp

    Code:

    Quellcode

    1. #include <iostream>
    2. using namespace std ;
    3. #include "Globale_Var.h"
    4. #include "funktion.h"
    5. void funktion() {
    6. cout << "Funktionsausgabe" << endl ;
    7. cout << a << b << c << endl ;
    8. return 0 ;
    9. }
    Alles anzeigen


    Datei: funktion.h
    Code:

    Quellcode

    1. #ifndef _FUNK_
    2. #define _FUNK_
    3. void funktion() ;
    4. #endif _FUNK_


    Datei: Globale_Var.h

    Code:

    Quellcode

    1. #ifndef _GLOBAL_
    2. #define _GLOBAL_
    3. int a = 10 ;
    4. int b = 20 ;
    5. int c = 30 ;
    6. #endif //_GLOBAL_



    Ich möchte unbedingt Globale Variablen verwenden, weil ich die "const int SCREEN_WIDTH = 640" überall mal im Programm benutzen muss.
    #include <stdio.h>
    int main(void) {
    printf("Hallo Welt!") ;
    return 0 ;
    }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LecramOS ()

  • Hallo.
    Aber "extern" ist doch nur für das spätere initialisieren von deklarierten Variablen. Es ist ein Irrtum, dass wenn man extern schreibt es sich darum handelt extern auf Variablen von
    anderen Dateien aus zuzugreifen. Extern bedeutet nur, dass man eine Variable erst später im Programm initialisiert, meine ich heute noch gelesen zu haben. Kann mich auch täuschen, aber ich meine es ist so... Ich gucke trotzdem noch mal genauer nach... Danke fürs erste :)

    EDIT: Das hilft mir trotzdem nicht weiter : (
    #include <stdio.h>
    int main(void) {
    printf("Hallo Welt!") ;
    return 0 ;
    }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von LecramOS ()

  • Das war schon richtig wie ich das geschrieben habe über "extern".

    Wenn sie bei der Deklaration einer Funktion die Speicherklasse nicht angeben, ist diese automatisch mit extern gesetzt. Solche Funktionen können sich auch in einer anderen Quelldatei befinden. Dann speziell empfiehlt es sich, dieses Schlüsselwort zu verwenden (auch wenn dies nicht nötig wäre). Dieser Hinweis kann hilfreich für den Programmierer sein, weil er sofort weiß, worum es sich handelt. extern zu setzen dient also nicht der Verbesserung bzw. Optimierung des Quellcodes, sondern ist ein Hinweis für dessen Leser.

    Heißt: Nur nicht initialisierte Variablen sind extern. !?!?!

    Weiß jemand eine lösung ?

    Ich möchte auf eine Initialisierte Variable von allen Teilen(Verschiedene Dateien) des Programms zugreifen können.

    B.s.p. const int BILDSCHIRM_HOEHE = 480 ; // <--- Auf diese Variable möchte ich von allen Teilen des Großen Programms zugreifen können.

    Edit: Hat sich rausgestellt, dass meine Code::Blocks Version einen Fehler hatte.
    #include <stdio.h>
    int main(void) {
    printf("Hallo Welt!") ;
    return 0 ;
    }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LecramOS ()

  • Globale Variable ich denke nicht das du benötigst, wenn du dein Design anders anlegst - aber das ist zugegeben nur eine Vermutung.

    Zu deinem Beispiel - warum nicht so:
    main.cpp:

    Quellcode

    1. #include <iostream>
    2. using namespace std ;
    3. #include "funktion.h"
    4. int main(void) {
    5. cout << funktion(10, 20, 30) << endl ;
    6. return 0 ;
    7. }
    Alles anzeigen

    funktion.cpp:

    Quellcode

    1. #include <iostream>
    2. using namespace std ;
    3. #include "funktion.h"
    4. int funktion(int a, int b, int c) {
    5. cout << "Funktionsausgabe" << endl ;
    6. cout << a << "+" << b << "+" << c << endl ;
    7. return( a + b + c) ;
    8. }
    Alles anzeigen

    funktion.h:

    Quellcode

    1. #ifndef _FUNK_
    2. #define _FUNK_
    3. int funktion(int a, int b, int c) ;
    4. #endif _FUNK_


    Da sind sicherlich noch ein paar Schönheitsoperationen möglich ;)

    MfG bcc-fan
  • Nun läufts.

    Ich habe erst Code::Blocks gelöscht gehabt und auch diesen versteckten Ordner gelöscht.
    Code::Blocks neu installiert und es ging immer noch nicht.

    Dann habe ich mich damit abgefunden, dass ich wahrscheinlich zu Banane bin Code::Blocks zu bedienen und Netbeans und auch Eclipse probeweise installiert.

    Bei Eclipse finde ich die Autovervollständigung echt gut, müsste mich jedoch "jetzt" mit Makefiles auseinander setzen, weil man da für jede Kleinigkeit selber ein Makefile schreiben muss. Das soll nicht Sinn der Sache sein, weil ich nämlich SDL lernen will und dazu OOP. Da kann ich mich mit den Makefile gedöns auch noch später Rum schlagen.

    Nun fehlte mir aber Code::Blocks und ich konnte mich damit nicht abfinden dieses Problem nicht zu lösen.

    Festplatte Formatiert. Neues Ubuntu 9.10 drauf. Alles Aktualisiert. Code::Blocks drauf . Code neu geschrieben
    und BAMM , er kompilierte es.

    Ich konnte nun die Variablen in einen Header deklarieren u. initialisieren mit " const int a = 10; " und habe diese globale_vars.h Datei in die funktion.h gelegt.
    Da die funktion.h sowohl in main.cpp und auch in funktion.cpp aufgerufen wird sind dort die Variablen für die Funktion und aber auch für die MainFunktion verfügbar .

    Hier nun weitere Fragen
    -Der Compiler sagt mir wenn ich globale_vars.h jeweils in main.cpp und funktion.cpp inkludiere, dass
    die Variablen doppelt deklariert sind warum aber nicht, wenn ich zweimal funktion.h jeweils in den beiden cpp dateien mit inkludiere. ?

    -Die Variablen der Beiden Aufrufe der funktion.h besitzen unterschiedliche Speicheradressen. Warum ?

    -Warum wird nicht auch der Doppelaufruf von globalen_vars.h( in main.cpp und funktion.cpp) in verschiedene speicheradressen aufgeteilt und somit das Problem der Doppeldeklaration umgangen ?

    -warum ist es schon wieder 22 Uhr ? : )

    Danke für Eure Hilfe : )
    #include <stdio.h>
    int main(void) {
    printf("Hallo Welt!") ;
    return 0 ;
    }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LecramOS ()

  • Ja...Warum sollte die Zeile 10 denn nicht so aussehen ?

    Wenn man die Variablen nun auf const oder static deklariert funktioniert es ja auch.

    #ifndef, #define und #endif müssen da sogar stehen, weil ansonsten der Compiler eine doppeldeklaration bemängeln würde.

    Wenn dich die beiden Schrägstriche "//" irritieren, das sind Kommentare genau wie bei C /* und */ nur dass man bei "//" kein
    Zeichenende brauch und sich das Kommentar nur auf eine Zeile bezieht.
    C kommentare sind aber auch weiter verwendbar.

    Das einzige Problem was jetzt noch herrscht ist. dass es sich nicht um "echte" Globale Variablen handelt, weil nämlich jeweils für den
    Aufruf der globale_var.h in main.cpp und funktion.cpp eine andere Speicherstelle benutzt wird. Aber da soll ja die Singleton Klasse helfen.

    Somit wäre das alle in Ordnung.

    Danke : )
    #include <stdio.h>
    int main(void) {
    printf("Hallo Welt!") ;
    return 0 ;
    }