Variable aus externe datei includieren ?



  • Übrigens muss deine main() -Funktion in C++ auf eine der folgenden Arten deklariert sein:

    int main();
    int main(int argc, char** argv);
    

    Den Rückgabetyp wegzulassen, wenn es sich um int handelt, ist nicht erlaubt!



  • Ok, jetzt funktioniert es.

    lösung:

    //////////////a.cpp
    #include <iostream>
    #include <string>
    
    extern std::string teststring="Jawoll";
    
    //////////////b.cpp
    #include <iostream>
    #include "a.cpp"
    using namespace std;
    
    int main(int argc, char** argv){
    cout << teststring;
    }
    

    Und schon gibt es das nächste problem, im oben gezeigten beispiel funkioniert es noch, aber in meinem projekt habe ich zwei .cpp dateien mit jeweils einer main() funktion. Der compiler gibt mir den fehler:

    declaration of C function 'int main()' conflicts with previous declaration 'int main(int, char**)'

    Muss ich da jetzt (wie bei den header dateien) mit ifdef abfragen ob es main gibt ?


  • Mod

    Analyse schrieb:

    Ok, jetzt funktioniert es.

    lösung:

    //////////////a.cpp
    #include <iostream>
    #include <string>
    
    extern std::string teststring="Jawoll";
    
    //////////////b.cpp
    #include <iostream>
    #include "a.cpp"
    using namespace std;
    
    int main(int argc, char** argv){
    cout << teststring;
    }
    

    😕 Das funktioniert? Das ist eigentlich falsch.

    Und schon gibt es das nächste problem, im oben gezeigten beispiel funkioniert es noch, aber in meinem projekt habe ich zwei .cpp dateien mit jeweils einer main() funktion. Der compiler gibt mir den fehler:

    declaration of C function 'int main()' conflicts with previous declaration 'int main(int, char**)'

    Muss ich da jetzt (wie bei den header dateien) mit ifdef abfragen ob es main gibt ?

    Die main Funktion ist der Einstiegspunkt deines Programms. Wie kannst du mehrere Einstiegspunkte haben? Du musst dich schon für einen entscheiden.



  • SeppJ schrieb:

    😕 Das funktioniert? Das ist eigentlich falsch.

    Sofern er den Header nur in einer .cpp-Datei inkludiert, kann er dort schon eine Variablendefinition hinschreiben. Oder meinst du was Anderes?


  • Mod

    Nexus schrieb:

    SeppJ schrieb:

    😕 Das funktioniert? Das ist eigentlich falsch.

    Sofern er den Header nur in einer .cpp-Datei inkludiert, kann er dort schon eine Variablendefinition hinschreiben. Oder meinst du was Anderes?

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Außerdem:
    `#include "a.cpp"

    `



  • Analyse schrieb:

    #include "a.cpp"
    

    Ja, so klappt es 😃 .

    Oh [/quote] vergessen...



  • Das inkludieren einer cpp-Datei funktioniert und ist auch nicht falsch. Aber man macht es trotzdem nicht, um zum Beispiel nicht alle cpp-Dateien neu übersetzten zu müssen, die nicht geändert wurden.



  • SeppJ schrieb:

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Ja,

    extern std::string teststring="Jawoll";
    

    ist eine Definition. So ist es aber selten sinnvoll.

    Das include "a.cpp" habe ich tatsächlich übersehen. Nie .cpp-Dateien einbinden!



  • SeppJ schrieb:

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Der er in jeder cpp-Datei auch eine main-Funktion stehen hat, wird das wohl nicht alles sein.



  • Langsam versteh ich garnichtsmehr.

    Ich habe ein projekt, das ich der übersichtlichkeit wegen in mehrere dateien splitten will. In der ersten datei sollen nun zb. werte errechnet werden, die ich in der zweiten datei abrage und mit denen weiterrechne.

    Wie soll das gehen wenn ich nur eine main() benutzen darf ?



  • Mit der main() Funktion steigst du in dein Programm ein. Dann kannst du alles was du machen willst packst du in Funktionen und rufst die in der main auf. Wenn du nicht weißt, was Funktionen sind, dann fang nochmal gaaanz vorne mit C++ an. Und um jetzt nochmal zu dem extern zurückzukommen. So ist es richtig:

    // extern.h
    extern std::string test;
    
    // a.cpp
    #include "extern.h"
    test = "teststring";
    // hier kannst du jetzt die Variable 'test' benutzen
    
    //b.cpp
    #include "extern.h"
    // hier auch, wenn du extern.h inkludiert hast
    


  • Analyse schrieb:

    Wie soll das gehen wenn ich nur eine main() benutzen darf ?

    Objektorientierte Programmierung, Strukturierte Programmierung. Such’s dir aus. Und kauf dir ein vernünftiges C++ Buch. Aus gegebenem Anlass kann ich DAS HIER empfehlen.

    mfg, René~



  • so hat es leider auch nicht funktioniert "Lösung", bekomme obwohl ich in beiden .cpp dateien die header datei mit der deklaration einbinde ein "nicht deklariert" als fehlermeldung.

    Naja ich merke schon das ich die geduld von einigen hier langsam überstrapaziere 🙄

    Danke für den tipp Rene aber ich habe bereits ein c++ buch was sogar fast den gleichen titel hat, leider ist es eine qual mit diesen büchern, bis ich da mal was gefunden habe...(trotz inhaltsverzeichniss..)
    dachte eigentlich das ist hier schnell gelöst aber scheint ja nun nicht so zu sein.

    Danke an alle, ich werd mir jetzt doch nochmal das buch raussuchen und versuchen das alleine zu lösen.



  • Analyse schrieb:

    Danke für den tipp Rene aber ich habe bereits ein c++ buch was sogar fast den gleichen titel hat, leider ist es eine qual mit diesen büchern, bis ich da mal was gefunden habe...(trotz inhaltsverzeichniss..)

    lol! Um C++ zu lernen liest man das Buch auch von links nach rechts durch und springt da nicht im Buch drin rum weil man meint, dass man schon alles kann, aber dann nicht mal weiß was die Funktion main() macht..

    mfg, René~



  • Mal eine andere Sache. Eigentlich arbeitet man nicht mit globalen Variablen. Und wenn man das berücksichtigt, dann ergibt sich das Problem mit extern auch nicht.



  • ich geh da eher nach learning by doing, wenn ich das im buch mal lese, vllt. eine übungsaufgabe dazu mache ist es beim nächstenmal buchaufschlagen weg. :p

    Und da ich schon erfahrungen in anderen programmiersprachen habe und aktuell ein projekt in c++ realisieren will, wo es halt mal an der ein oder anderen stelle hakt da ich noch relativ neu in c++ bin such ich mir das halt im inet zusammen oder frag mal in der community nach.

    Mal eine andere Sache. Eigentlich arbeitet man nicht mit globalen Variablen. Und wenn man das berücksichtigt, dann ergibt sich das Problem mit extern auch nicht.

    Sondern dann mit funkionsaufrufen ? hab ich das wenigstes mitgenommen 😕 😮



  • Analyse schrieb:

    Sondern dann mit funkionsaufrufen ? hab ich das wenigstes mitgenommen 😕 😮

    Genau so. 🙂
    Ich weiß nicht was du genau vor hast, aber man kann dein Problem in etwa so angehen.

    // text.h
    #ifndef HEADER
    #define HEADER
    #include <string>
    
    // Prototypen zum Lesen und Schreiben
    void text_schreiben(std::string text);
    std::string text_lesen();
    
    #endif
    
    // text.cpp
    #include "text.h"
    
    static std::string mein_text;
    
    void text_schreiben(std::string text)
    {
        mein_text = text;
    }
    
    std::string text_lesen()
    {
        return mein_text;
    }
    
    // main.cpp
    #include <iostream>
    #include <ostream>
    #include "text.h"
    
    int main()
    {
        text_schreiben("Hallo du!");
        std::cout << text_lesen() << std::endl;
        return 0;
    }
    

    Wie du siehst ist der Text immer noch nicht wirklich gekapselt, wird aber schon mal auf das eine cpp-File durch die Eigenschaft static beschränkt. An der Stelle könnte man sich auch eine Klasse mit statischen Methoden erstellen und dann die Variable darin schützen. Was dann so aussehen würde.

    // text.h
    #ifndef HEADER
    #define HEADER
    #include <string>
    
    class Text
    {
        static std::string mein_text;
    public:
        static void schreiben(std::string text)
        {
            mein_text = text;
        }
        static std::string lesen()
        {
            return mein_text;
        }
    };
    
    #endif
    
    // main.cpp
    #include <iostream>
    #include <ostream>
    #include "text.h"
    
    int main()
    {
        Text::schreiben("Hallo du!");
        std::cout << Text::lesen() << std::endl;
        return 0;
    }
    

    Das kann man jetzt noch weiter treiben und daraus ein Singleton basteln, dass muss man aber einen Anfänger jetzt nicht unbedingt antun. Wenn du den Code aber verstanden hast, verstehst du auch ein Singleton. Wirklich wichtig hierbei ist die Bedeutung oder auch die verschieden Bedeutungen des Schlüsselwortes static . Je nach Kontext ist die Aussage nicht die gleiche.



  • Jetzt habe ich es endlich hinbekommen.

    Schönes beispiel, danke Nick.

    Ich arbeite mit CodeBlocks und hatte den build modus auf "Debug" stehen, weiss jetzt nicht was er da genau macht, anscheinend keine externen dateien einbinden .?

    Jedenfalls hat es wunderbar funktioniert als ich auf "Release" umgestellt habe 🙄

    Danke für eure hilfe.

    mfg Analyse



  • Analyse schrieb:

    Und da ich schon erfahrungen in anderen programmiersprachen habe und aktuell ein projekt in c++ realisieren will, wo es halt mal an der ein oder anderen stelle hakt da ich noch relativ neu in c++ bin such ich mir das halt im inet zusammen oder frag mal in der community nach.

    Egal, was du schon für Programmiersprachen kennst – C++ ist anders. Ich würde am besten von vorne anfangen mit lernen. Wenn du etwas schon kennst, kannst du es ja immer noch schnell überfliegen. Aber oft sind Dinge doch nicht genau so, wie du sie bereits kennst, von daher lohnt es sich, sie genau anzuschauen. Man sieht hier z.B. ab und zu Java-Programmierer, die glauben, sie könnten im Grossen und Ganzen wie gewohnt weiterprogrammieren. Doch die Programmierparadigmen unterscheiden sich fundamental, was auf den ersten Blick nicht ersichtlich ist.

    Und nein, Debug-Modus hat nichts mit externen Dateien zu tun, und diese haben nichts mit extern zu tun. Auch Dinge, die du beim sorgfältigen Studium eines Buchs lernen würdest.



  • Analyse schrieb:

    ich geh da eher nach learning by doing, wenn ich das im buch mal lese, vllt. eine übungsaufgabe dazu mache ist es beim nächstenmal buchaufschlagen weg. :p

    Und da ich schon erfahrungen in anderen programmiersprachen habe und aktuell ein projekt in c++ realisieren will, wo es halt mal an der ein oder anderen stelle hakt da ich noch relativ neu in c++ bin such ich mir das halt im inet zusammen oder frag mal in der community nach.

    ...

    Sowas freut einen richtig - gesunde Einstellung. Warum sollte ich ein Buch lesen - viel zu anstrengend. Ich kopier mir einfach n bisl code ausm Internet zusammen und schau mal obs läuft.
    Ich versteh zwar nichtmal wofür ich ne main-Funktion brauch, aber es gibt ja glücklicherweise genug Leute, die n Buch gelesen haben. Die können mir das dann erklären und ich hab Zeit gespart.

    *thumbs up*

    Achja: Wenn alle Stricke reissen wechsel ich von Debug einfach auf Release 😃


Anmelden zum Antworten