[Gelöst] OOP Globale Variablen und mehrer Dateien.


LecramOS

Member
Joined
Feb 20, 2010
Messages
121
Age
39
Location
Pandora.
LOCATION
Pandora.
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 ? :confused:??

TESTPROG.

Datei: main.cpp
Code:
#include <iostream>
using namespace std ;

#include "Globale_Var.h"
#include "funktion.h"

int main(void) {

    funktion() ;
    cout << a+b+c << endl ;

return 0 ;
}
Datei: funktion.cpp
Code:
#include <iostream>
using namespace std ;

#include "Globale_Var.h"
#include "funktion.h"

void funktion() {

     cout << "Funktionsausgabe" << endl ;
     cout << a << b << c << endl ;

return 0 ;
}
Datei: funktion.h
Code:
#ifndef _FUNK_
#define _FUNK_


void funktion() ;


#endif _FUNK_
Datei: Globale_Var.h
Code:
#ifndef _GLOBAL_
#define _GLOBAL_


int a = 10 ;
int b = 20 ;
int c = 30 ;


#endif //_GLOBAL_

Ich möchte unbedingt Globale Variablen verwenden, weil ich die "const int SCREEN_WIDTH = 640" überall mal im Programm benutzen muss.
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>I,<br/>
hab mir Dein Code mal angeschaut, keine Ahnung was du vorhast <E>:D</E>....<br/>
Aber wenn du eine Klasse mit den ganze "ganzen" globalen variablen als static deklarierst sollte es funzen. In OOP gibt es sowas wie globale variablen. Meines erachtens nichtmehr. <br/>
MfG</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>globalevar.h
<CODE><s>
Code:
</s>extern int var1;<e>
</e></CODE>
und in globalevar.cpp (oder ganz woanders...)
<CODE><s>
Code:
</s> int var1 = 0815;<e>
</e></CODE>

<URL url="http://wiki.answers.com/Q/What_is_the_use_of_extern_in_C"><LINK_TEXT text="http://wiki.answers.com/Q/What_is_the_u ... xtern_in_C">http://wiki.answers.com/Q/What_is_the_use_of_extern_in_C</LINK_TEXT></URL><br/>
<URL url="http://tutorial.schornboeck.net/variablen.htm">http://tutorial.schornboeck.net/variablen.htm</URL><br/>
<br/>
Bei irgendwelchen Sachen, die const sind, kannst du dir das aber sparen und die Variable direkt in den Header pappen.</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Hi... <E>:-(</E> <br/>
Leider muss ich schreiben, dass es nicht funktioniert hat. <br/>
Ich habe nun eine Klasse erstellt die die ganzen "Globalen" Variablen tragen sollte aber wieder mit <br/>
der gleichen Fehlermeldung wie zuvor. <br/>
<br/>
<B><s></s>Evil Azrael: Zu deiner Sache schreibe ich gaaanz unten was.<br/>
Habe deinen Post grade bekommen, als ich diesen wegschicken wollte.<e>
</e></B><br/>
<br/>
Wie muss ich den beim OOP mit den Variablen Umgehen ?<br/>
Sonst konnte ich einfach eine "Globale konstante integer Variable erzeugen und die BILDSCHIRM_WEITE nennen" <br/>
und dann immer schön mit BILDSCHIRM_WEITE auf ihren Inhalt zugreifen.<br/>
Der Wert des Bildschirms wird bei SDL ja auch oft benötigt. Wie funktioniert das denn nun beim OOP ?<br/>
Ich probiere Morgen einfach mal ein bisschen weiter mit den Klassen und trickse mir da einen zurecht.<br/>
Ich habe auch schon von dieser "Singleton Klasse" gehört doch weiß nicht richtig wie man die benutzt.<br/>
Mit ihr sollte man so eine Art Globale Variablen erzeugen können, doch wie schon geschrieben, ich verstehe nicht <br/>
wie ich diese richtig nutzen soll b.z.w. wie ich ihr variablen zuweisen kann und wie ich diese dann aufrufe, weil die <br/>
doch schon ein bisschen komplizierter ist als die normalen Klassen, aber egal... Zurück zum Thema <E>:)</E> <br/>
<br/>
Fehlermeldung: <B><s></s>/main.cpp|9|undefined reference to `funktion()'|<e></e></B><br/>
<br/>
So sieht es nun aus.<br/>
<br/>
<B><s></s>Datei1: main.cpp<e></e></B>
<CODE><s>
Code:
</s>#include <iostream>
using namespace std ;

#include "Globale_Var.h"
#include "funktion.h"

int main(void) {

    funktion() ;
    cout << Global.BILD << endl ;

return 0 ;
}
<e>
</e></CODE>
<B><s></s>Datei2: funktion.cpp<e></e></B>
<CODE><s>
Code:
</s><i>
</i>#include <iostream>
using namespace std ;

#include "funktion.h"
#include "Globale_Var.h"


void funktion() {

     cout << "Funktionsausgabe" << endl ;
     cout << Global.BILD << endl ;

}
<e>
</e></CODE>
<B><s></s>Datei3: funktion.h<e></e></B>
<CODE><s>
Code:
</s><i>
</i>#ifndef _FUNK_
#define _FUNK_


void funktion() ;


#endif _FUNK_
<e>
</e></CODE>
<B><s></s>Datei4: Global_Var.h<e></e></B>
<CODE><s>
Code:
</s><i>
</i>#ifndef _GLOBAL_
#define _GLOBAL_

static class Variablen{
private:

public:
int BILD ;
Variablen() ;
~Variablen() ;

} Global ;

//Konstruktor.
Variablen::Variablen() {
    BILD = 640 ;
}

//Destruktor.
Variablen::~Variablen() {
}

#endif // _GLOBAL_
<e>
</e></CODE>

<br/>
So.. nun habe ich den Code auch nach Evil Azraels Methode geändert, doch ich bekomme IMMER den gleichen Fehler vom <br/>
Compiler gesagt.<br/>
<br/>
main.cpp|9|<B><s></s>undefined reference to `funktion()'<e></e></B>|<br/>
<br/>
-Ich habe die Variablen als extern deklariert gehabt ohne sie zu initialisieren und habe sie erst später in einen anderen Programmabschnitt initialisiert. <br/>
<br/>
-Ich habe die Variablen als extern const deklariert gehabt und sie direkt im Header initialisiert und natürlich auch überall den Code angepasst.<br/>
<br/>
-Ich habe bestimmt wirklich fast alles probiert, doch bekomme immer diesen einen Fehler .<br/>
<B><s></s>" undefined reference to `funktion()' "<e></e></B> <E>:dash:</E></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Der Fehler hat absolut nix mit globalen variablen oder so zu tun. Zeig mal wie du deinen Kram kompilierst, denn formal sind main.cpp und funktion.h/cpp in Ordnung. Ich vermute mal, du hast das Linking noch nicht verstanden. <br/>
<br/>
Singleton ist ein Standardmuster, das man in C++ können sollte. Auch hier hilft mal wieder Wikipedia weiter: <br/>
<URL url="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_C.2B.2B"><LINK_TEXT text="http://de.wikipedia.org/wiki/Singleton_ ... in_C.2B.2B">http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B</LINK_TEXT></URL><br/>
<br/>
Weiter würde ich in dieser globale_var.h auch keine Klassen definieren. Üblich ist es eine Klasse immer in ein eigenes .cpp/.h Paar zu speichern.<br/>

<QUOTE><s>
</s>-Ich habe die Variablen als extern const deklariert gehabt und sie direkt im Header initialisiert und natürlich auch überall den Code angepasst.<e>
</e></QUOTE>
Dann hast du den entscheidenen Satz in dem zweiten Link nicht gesehen. <br/>
extern int abc123; bedeutet, es gibt eine variable vom typ int mit dem namen abc123, ich mach hier jetzt ihren Namen bekannt, aber sie ist irgendwo anders gespeichert. Wo, das finden wir beim linken raus..<br/>

<CODE><s>
Code:
</s><i>
</i>main.cpp
#include "funktion.h"
#include globalvars.h"

#include <iostream>
using namespace std; 

int main(int argc, char **argv)
{
	funktion(); 
	cout << counter << endl; 
	cout << message << endl; 
	return 0; 
}


funktion.h
#ifndef FUNKTION_H
#define FUNKTION_H

void funktion(); 

#endif

funktion.cpp
#include  "funktion.h"
#include <iostream.h>

void funktion()
{
 std::cout << counter << std::endl; 
 std::cout << "Hier funkt es... " << std::endl; 
 counter++;
}


globalvars.h
#ifndef GLOBALVARS_H
#define GLOBALVARS_H

extern int counter; 
extern char *message; 

#endif

globalvars.cpp
//wir brauchen nichtmals ein include ;) 

int counter = 0; 
char *message = "Hallo Welt"; 
<e>
</e></CODE>
Das sollte es tun..</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Danke erst mal, dass Ihr euch Zeit nehmt für mein Problemchen.<br/>
Eigentlich müsste das ja nun wirklich laufen aber es kommt immer noch der selbe Fehler.<br/>
<br/>
Ich benutze die IDE Code::Blocks unter Linux(Ubuntu). <br/>
Ich glaube die benutzt den g++ Compiler. <br/>
<br/>
Was muss ich denn da noch extra linken ?<br/>
<br/>
wenn ich mit SDL arbeite habe ich bisher nur die SDL libs. in <br/>
den Linker Einstellungen mit einbezogen.<br/>
Aber bei so Standard Zeugs wie in dem Testprogramm <br/>
habe ich noch nie irgendwas in den Linker Einstellungen <br/>
eingefügt b.z.w. geschrieben. <br/>
<br/>
<E>:confused:??</E><br/>
<br/>
Ist das erste mal, dass ich ein Projekt auf mehrere Dateien legen will.</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<t>An sich sollte sich CB um die gesamte Kompilierung kümmern. Hab länger nicht mehr mehr mit CB gearbeitet, gibt's denn da während dem kompilieren kein Ausgabefenster wo du den Text mal rüberkopieren kannst?</t>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Build log :
<CODE><s>
Code:
</s>-------------- Build: Debug in GlobalerTest ---------------

Linking console executable: bin/Debug/GlobalerTest
obj/Debug/main.o: In function `main':
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/main.cpp:12: undefined reference to `funktion()'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
1 errors, 0 warnings
 <e>
</e></CODE>

Der Reiter da neben namens, Code::Blocks :
<CODE><s>
Code:
</s>Scanning for lexers in /usr/share/codeblocks/lexers/...
Found 32 lexers
Loading lexer_verilog
Loading lexer_prg
Loading lexer_python
Loading lexer_squirrel
Loading lexer_fortran
Loading lexer_nsis
Loading lexer_batch
Loading lexer_angelscript
Loading lexer_d
Loading lexer_css
Loading lexer_xml
Loading lexer_OgreMaterial
Loading lexer_lua
Loading lexer_latex
Loading lexer_vhdl
Loading lexer_properties
Loading lexer_f77
Loading lexer_cpp
Loading lexer_rc
Loading lexer_html
Loading lexer_make
Loading lexer_masm
Loading lexer_OgreCompositor
Loading lexer_hitasm
Loading lexer_vbscript
Loading lexer_gm
Loading lexer_cg
Loading lexer_glsl
Loading lexer_perl
Loading lexer_diff
Loading lexer_bash
Loading lexer_matlab
Scanning for plugins in /home/lecramos/.codeblocks/share/codeblocks/plugins
Loaded 0 plugins
Scanning for plugins in /usr/lib/codeblocks/plugins
Loaded 11 plugins
Loading:
ClassWizard
CodeCompletion
Compiler
AStylePlugin
OpenFilesList
Debugger
ToDoList
ScriptedWizard
FilesExtensionHandler
ProjectsImporter
Autosave
Running startup script
Script/function 'edit_startup_script.script' registered under menu '&Settings/-Edit startup script'
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/funktion.cpp
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/funktion.h
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/globale_var.cpp
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/globale_var.h
<e>
</e></CODE>

Und hier der verwendete Code, wobei ich dazu sagen muss, dass ich auch schon die Funktion aus Test Zwecken extern gesetzt hatte um zu gucken wie es sich verhält. Setze ich die Funktion also im Header, bei dem Prototypen, extern und bei der Funktionsdefinition, in der funktions.cpp auch, konnte ich mit "void funktion();" als Aufruf(anstatt einfach funktion();) in der main.cpp diese Fehlermeldung umgehen, jedoch wurde erst gar nicht die Funktion aufgerufen... <br/>
Liegt wahrscheinlich daran, dass ich damit eine komplett andere (neue) Funktion erstellt hatte die gar nichts mit der <br/>
Funktion im Header zu tun hatte.. <E>:dash:</E> <br/>

<CODE><s>
Code:
</s>// main.cpp

#include <iostream>
using namespace std ;

#include "funktion.h"
#include "globale_var.h"


int main(int argc, char* argv[]) {

    funktion() ;

    cout << a << " " << b << " " << c << endl ;

return(0) ;

}<e>
</e></CODE> <br/>

<CODE><s>
Code:
</s>// main.cpp

#include <iostream>
using namespace std ;

#include "funktion.h"
#include "globale_var.h"


int main(int argc, char* argv[]) {

    funktion() ;

    cout << a << " " << b << " " << c << endl ;

return(0) ;

}<e>
</e></CODE>

<CODE><s>
Code:
</s>// funktion.h

#ifndef _FUNK_
#define _FUNK_

void funktion() ;

#endif //_FUNK_
<e>
</e></CODE> <br/>

<CODE><s>
Code:
</s>// globale_var.h

#ifndef _GLOBALE_
#define _GLOBALE_

const extern int a = 10 ;
const extern int b = 20 ;
const extern int c = 30 ;

#endif //_GLOBALE_
<e>
</e></CODE></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Auch "clean" und "rebuild" haben nichts gebracht. <br/>
Gleiche Fehlermeldung in der Konsole über "g++" .<br/>
<E>:confused:??</E><br/>
<B><s></s><br/>
EDIT:<e>
</e></B><br/>
Aber Egal, Evil Azrael... Ich muss mich sowieso mehr in den OOP Bereich einarbeiten und da gibt es bestimmt elegantere möglichkeiten. Danke <E>:ph34r:</E></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<t>Hi,<br/>
ich bin jetzt nicht so bewandert in c++ aber konnte es am namespace liegen,da ja in der Funktion.h das using namespace Std nicht enthalten ist. Ist nur ne Idee.<br/>
<br/>
MfG</t>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r>Nee... Hat damit leider nix zu tun gehabt , aber danke <E>:)</E></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r><QUOTE author="Dr.Damn Fist"><s>
Dr.Damn Fist said:
</s>Hi,<br/>
ich bin jetzt nicht so bewandert in c++ aber konnte es am namespace liegen,da ja in der Funktion.h das using namespace Std nicht enthalten ist. Ist nur ne Idee.
<e>
</e></QUOTE>

Mit using namespace std; sagst du dem Compiler, dass er auf der Suche nach Symbolen auch in den Namespace gucken soll. Wenn du beispielsweise std::cout benutzt, dann sagst du dem Compiler, ich will cout aus dem Namespace std. using namespace ist also nur eine Vereinfachung. <br/>
<br/>
In meiner funktion.h oben fehlt der globalvars include, ansonsten:
<CODE><s>
Code:
</s>root@router:/tmp/test# g++ funktion.cpp -c -o funktion.o
root@router:/tmp/test# g++ globalvars.cpp -c -o globalvars.o
globalvars.cpp:4: warning: deprecated conversion from string constant to 'char*'
root@router:/tmp/test# g++ main.cpp -c -o main.o
root@router:/tmp/test# g++ main.o funktion.o globalvars.o -o test.exe
root@router:/tmp/test# ./test.exe
0
Hier funkt es...
1
Hallo Welt
<e>
</e></CODE>
Der Warning ist nicht dramatisch.<br/>
<br/>
alternativ:
<CODE><s>
Code:
</s><i>
</i>root@router:/tmp/test# rm *.o *.exe
root@router:/tmp/test# g++ main.cpp funktion.cpp globalvars.cpp -o test.exe
globalvars.cpp:4: warning: deprecated conversion from string constant to 'char*'
root@router:/tmp/test# ./test.exe
0
Hier funkt es...
1
Hallo Welt
<e>
</e></CODE>

Versuch's mal ohne Code::Blocks. Entweder stimmt mit CB was nicht, oder deine Build-Umgebung hat ein Problem.</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r><CODE><s>
Code:
</s><i>
</i>//funktion.cpp

#include "global_vars.h"
#include "funktion.h"

int funktion(){
    return a+b+c;
}
<e>
</e></CODE>

<CODE><s>
Code:
</s><i>
</i>//funktion.h

int funktion(void);
<e>
</e></CODE>

<CODE><s>
Code:
</s><i>
</i>//global_vars.h
static int a = 10;
static int b = 20;
static int c = 30;
<e>
</e></CODE>

<CODE><s>
Code:
</s><i>
</i>//main.cpp
#include "global_vars.h"
#include "funktion.h"
#include <iostream>
using namespace std ;

int main(){
    cout <<"a+b+c: "<< a+b+c << "\n";
    cout <<"fuinktion: "<< funktion() << "\n";
}
<e>
</e></CODE>

Ich verstehe dein Problem zwar nicht so ganz, aber das oben funktioniert.</r>
 
[GELÖST] OOP Globale Variablen und mehrer Dateien.

<r>Das ist jetzt kein Problem in dem Sinne, dass es <B><s></s>unbedingt<e></e></B> gelöst werden muss, sondern eher so eine <br/>
Verständnis Teil, was ich halt Kapieren will. <br/>
<br/>
Es scheint ja wirklich zu laufen, <B><s></s>über Code::Blocks<e></e></B> jedoch nicht.<br/>
<br/>
/home/lecramos/Programmieren/#HalloWelt/GlobalerTest/main.cpp|9|<B><s></s>undefined reference to `funktion()<e></e></B>'| <E>RTFM</E> <br/>
<br/>
Mittlerweile Lache ich da drüber und mach mir da einfach keinen Kopf mehr, gebe mir selber einen <E>:slap:</E> und Lerne weiter. <br/>
<br/>
Das soll ja sowieso nicht das non plus ultra mit diesen Globalen zeugs sein beim OOP. <br/>
Anscheinend liegt das Problem bei Code::Blocks, dass es halt wirklich extremst drauf reagiert, <br/>
wenn man sich nicht an OOP hält.<br/>
<br/>
Wenn jemand dies unter Code::Blocks(mit Standard Einstellungen) zum Laufen bekommt kann er es ja mal posten.</r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<t>Also bei mir läuft es unter code::blocks</t>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r><E>:huh:</E> Wie lautet denn deine Code::Blocks Version torro ? <br/>
Hast du irgendwelche Einstellungen vorgenommen ?<br/>
<br/>
<E>:confused:??</E></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<t>Code::Blocks 8.02 unter Ubuntu 9.10<br/>
eingestellt hab ich nichts, nur zum testen vorhin installiert.<br/>
<br/>
Wenn du willst, schick ich dir die Projektdaten, vielleicht hast du ja was verstellt.</t>
 
Re: OOP Globale Variablen und mehrer Dateien.

<r><E>:O</E> Also, ich dachte ja, dass dieses von mir "klein" benannte Problemchen nicht weiter schlimm sein wird in der OOP .<br/>
Falsch gedacht. Jetzt sagt der mir nämlich sogar schon einen Fehler(immer den gleichen) wenn ich ein Tutorial Programm <br/>
aus dem Lehrbuch abschreibe und compiliere .<br/>
<br/>
Ich probiere mal Code::Blocks Komplett zu Löschen, neu zu installieren und hoffe, dass das dann verschwindet.<br/>
<br/>
Wenn dann immer noch nicht, nehme ich natürlich gerne die Projekt Daten von dir an torro. <E>:)</E> <br/>
<br/>
Sowas komisches aber auch <E>:confused:??</E><br/>
<br/>
<br/>
<B><s></s>EDIT: torro sende mir bitte die nötigen Dateien (am besten alles) an <EMAIL email="booksdie@live.de">booksdie@live.de</EMAIL><br/>
Immer noch das gleiche Problem.<e>
</e></B> <E>:-((</E></r>
 
Re: OOP Globale Variablen und mehrer Dateien.

<t>Dein Problem hat mit "OOP" leider überhaupt nix zu tun. CB kann übrigens auch für C verwendet werden, und da würde vermutlich das gleiche Problem auftreten. Es wird wohl eher was mit deinen Projekteinstellungen zu tun haben.</t>
 
Back
Top