anfänger hat probleme mit globalen variablen



  • @davie

    hmm also mit strlen funktioniert es nicht mal ohne globale objekte. da ich noch anfänger bin mach ich vielleicht auch irgendwas anderes falsch. vielleicht kannst du mir mal die entsprechenden passagen umschreiben und posten :).

    mfg david



  • einmal mit c-strings

    //Nummer 1
    #ifndef Adresse_h  
    #define Adresse_h
    
    //Nummer 2
    /*#include <cstring>*/
    
    class adresse
    {
    private:
        char stadt[20];
        char strasse[25];
        char telefon[15];
    public:
        adresse(const char *stadt="xxxxxx",const char *strasse="xxxxxx", const char *telefon="000000");
        ~adresse();
        void setadresse(const char *,const char *,const char *);
        void putadresse();
    };
    
    #endif
    
    #include "adresse.h"
    #include <iostream>
    //Nummer 3
    #include <cstring>
    using namespace std;
    
    //Nummer 4
    namespace
    {
       int anzahl=0; //oder lieber in die klasse rein?
    }
    
    adresse::adresse(const char *stadt,const char *strasse,const char *telefon)
    {
        setadresse(stadt,strasse,telefon);
        ++anzahl;
    
        cout << "\nEs wurde das Objekt fuer die Stadt " << stadt << " erschaffen!\n";
        cout << "Das war das " << anzahl << ". Objekt!\n";
    }
    
    adresse::~adresse()
    {
        --anzahl;
        cout << "\nEs wurde das Objekt fuer die Stadt " << stadt << " zerstoert!\n";
        cout << "Es verbleiben noch " << anzahl << " Objekte!\n";
    }
    
    void adresse::setadresse(const char *city,const char *street,const char *nummer)
    {
        strncpy(stadt,city, strlen(city)+1);
        strncpy(strasse,street, strlen(street)+1);
        strncpy(telefon,nummer,strlen(nummer)+1);
    }
    
    void adresse::putadresse()
    {
        cout << "Strasse:\t" << stadt << '\n';
        cout << "Stadt:  \t" << strasse << '\n';
        cout << "Telefon:\t" << telefon << '\n';
    
        cin.get();
    }
    
    #include "adresse.h"
    #include <iostream>
    using namespace std;
    
    void func ();
    
    adresse eins("Rostock","Rosenweg 12","0170/1964619");
    
    int main ()
    {
        eins.putadresse();
    
        adresse a;
        a.putadresse();
        a.setadresse("13055 Berlin","Arendsweg 13","030/9821609");
        a.putadresse();
    
        cout << "Es folgt der erste Aufruf der Funktion func()\n\n";
    
        func();
    
        cout << "Es folgt der zweite Aufruf der Funktion func()\n\n";
    
        func();
    
        //Nummer 5
        //return 0;
    }
    
    void func()
    {
        static adresse spez1("09471 Baerenstein","Rosenweg 12","037347/84973");
        spez1.putadresse();
    
        adresse funktion("16792 Zehdenick","Falterstrasse 17","03307/302589");
        funktion.putadresse();
    
        cout << "\nVor dem Ende der Funktion!\n\n";
    }
    

    vielleicht auch mit

    void adresse::setadresse(const char *city,const char *street,const char *nummer)
    {
        strcpy(stadt,city);
        strcpy(strasse,street);
        strcpy(telefon,nummer);
    }
    

    und mit std::strings

    //Nummer 1
    #ifndef Adresse_h  
    #define Adresse_h
    
    //Nummer 2
    #include <string>
    
    class adresse
    {
    private:
        //Nummer 3
        std::string stadt;
        std::string strasse;
        std::string telefon;
    public:
        //Nummer 4
        adresse(std::string const& stadt="", std::string const& strasse="", std::string const& telefon="");
        ~adresse();
        //Nummer 5
        void setadresse(std::string const&, std::string const&, std::string const&);
        void putadresse();
    };
    
    #endif
    
    #include "adresse.h"
    #include <iostream>
    using namespace std;
    
    //Nummer 6
    namespace {
       int anzahl=0; //oder lieber in die klasse rein?
    }
    
    //Nummer 7
    adresse::adresse(string const& stadt, string const& strasse, string const& telefon)
     : stadt(stadt), strasse(strasse), telefon(telefon)
    {
        ++anzahl;
        cout << "\nEs wurde das Objekt fuer die Stadt " << stadt << " erschaffen!\n";
        cout << "Das war das " << anzahl << ". Objekt!\n";
    }
    
    adresse::~adresse()
    {
        --anzahl;
        cout << "\nEs wurde das Objekt fuer die Stadt " << stadt << " zerstoert!\n";
        cout << "Es verbleiben noch " << anzahl << " Objekte!\n";
    }
    
    //Nummer 8
    void adresse::setadresse(string const& city, string const& street, string const& nummer)
    {
       stadt=city;
       strasse=street;
       telefon=nummer;
    }
    
    void adresse::putadresse()
    {
        cout << "Strasse:\t" << stadt << '\n';
        cout << "Stadt:  \t" << strasse << '\n';
        cout << "Telefon:\t" << telefon << '\n';
    
        cin.get();
    }
    
    #include "adresse.h"
    #include <iostream>
    using namespace std;
    
    void func ();
    
    adresse eins("Rostock","Rosenweg 12","0170/1964619");
    
    int main ()
    {
        eins.putadresse();
    
        adresse a;
        a.putadresse();
        a.setadresse("13055 Berlin","Arendsweg 13","030/9821609");
        a.putadresse();
    
        cout << "Es folgt der erste Aufruf der Funktion func()\n\n";
    
        func();
    
        cout << "Es folgt der zweite Aufruf der Funktion func()\n\n";
    
        func();
    
        //Nummer 9
        //return 0;
    }
    
    void func()
    {
        static adresse spez1("09471 Baerenstein","Rosenweg 12","037347/84973");
        spez1.putadresse();
    
        adresse funktion("16792 Zehdenick","Falterstrasse 17","03307/302589");
        funktion.putadresse();
    
        cout << "\nVor dem Ende der Funktion!\n\n";
    }
    

    müsste alles funktionieren, wenn keine tippfehler drin sind.



  • ... schrieb:

    Mit Initialisierungsliste meine ich das hier:

    was eine initialisierungsliste ist, weiß ich. trotzdem fehlt doch irgendwie der bezug?



  • @davie

    erst mal danke für die mühe 🙂 habe beide versionen ausprobiert funktionieren beide genauso wie die ursprüngliche. sobald ich aber das globale objekt eins der klasse adresse initializiere passiert dasselbe drei mal das am anfang beschriebene fenster keine ausführung des programms. compilieren tut ers ohne fehler oder warnungen.

    irgendwas mit globalen objekten klappt nicht. aber was? bei normalen globalen variablen wie anzahl gibt es keine probleme.

    wieso hast du die variable anzahl in namespace verpackt? was ist der efekt oder sinn?

    was ist in <string> definiert?

    das return in der main hast du einfach so auskommentiert gibts da keine probleme oder was ist davon der sinn das mann es nicht schreibt?

    mfg david



  • hmmm weiß keiner eine antwort?

    mfg david



  • hmmm

    es muss doch irgendjemand eine antwort für dieses problem haben?

    oder ist euch der beitrag schon zu lang, dann post ich ihn nochmal neu?

    mfg david



  • Hast du schon mal daran gedacht, den Debugger zu verwenden, um zu sehen wo es Probleme gibt?



  • ich hab leider kein debugger 🤡 aber ich schätze mal das wird nichts bringen weil der compiler es ohne probleme kompiliert.

    nur beim start der exe datei kommt eine fehlermeldung von windows und die muss ich drei mal wegdrücken wie schon mehrmals erwähnt.

    zum thema debugger kannt du mir einen empfehlen un dgibt es sowas eventuell kostnlos?

    mfg david



  • Trantüte schrieb:

    ich hab leider kein debugger 🤡 aber ich schätze mal das wird nichts bringen weil der compiler es ohne probleme kompiliert.

    Natürlich bringt das uU was, weil du den Debugger ja zur Laufzeit betreibst.

    Trantüte schrieb:

    zum thema debugger kannt du mir einen empfehlen un dgibt es sowas eventuell kostnlos?

    Beim Dev-C++ ist zB einer dabei (gdb), ist in der aktuellen Version der IDE sogar benutzbar. Wenn du einen richtig genialen Debugger suchst, dann solltest du dir mal VC++ Express 2005 anschaun. Über die kostenlose Beta IDE gibts mehr als genug Threads hier im Forum.



  • @groove

    der debugger bringt daher nichts weil ich ja schon weiß wo der fehler passiert nämlich wenn er verscuht das globale objekt der klasse adresse namens eins initialisieren will.

    mfg david



  • @groove

    hab noch vergessen zu fragen ob der vc++ express 2005 auf deutsch is?

    mfg david



  • NATÜRLICH bringt er was.. er ist zur LAUFZEIT...
    er hält an, wenn ein fehler ist..
    tipp: haltepunkte



  • Hallo

    und der Debugger zeigt dir die tatsächlichen Werte der Variablen und Zeiger an.

    bis bald
    akari



  • Trantüte schrieb:

    der debugger bringt daher nichts weil ich ja schon weiß wo der fehler passiert nämlich wenn er verscuht das globale objekt der klasse adresse namens eins initialisieren will

    Und jetzt lässt du deinen Debugger auf den adresse ctor los, gehst jede Codezeile Schritt für Schritt durch und schon siehst du mehr. 😉

    Trantüte schrieb:

    hab noch vergessen zu fragen ob der vc++ express 2005 auf deutsch is?

    nee, ist englisch



  • @groove

    hab mal nach dem vc++ express 2005 geschaut aber nicht so das passende gefunden.

    bei einer homepage konnte man ihn zwar downloaden allerdings ist der wohl 60 mb gross und ich hab nur ein 56k modem 🤡.

    dann konnte man ihn auch per cd bestellen da konnte man aber wieder nicht deutschland als land auswählen.

    kannst mir nen link posten oder nen anderen (möglichst deutschen) debugger empfehlen?

    mfg david



  • Ja, VC++ express 2005 ist knapp 70MB, dazu kommen nochmal 25MB .NET Framework 2.0, was du auch brauchst. Ist mit 'nem Modem schon etwas heftig, dafür bekommst du aber auch 'ne klasse IDE.
    Wie gesagt, es gibt dann noch den gdb. der ist zB bei Dev-C++ dabei. Welche IDE bzw welchen Compiler benutzt du denn?

    Wenn du keinen brauchbaren Debugger findest, dann gibt es auch noch 'ne andere Möglichkeit. Du baust dir selbst 'ne Art Mini-Debugger. Dazu baust du in deinen Code (in deinem Bsp wäre ein Anfang im adresse ctor sinnvoll) Zeile für Zeile Ausgaben in eine Log-Datei ein. Das sieht dann zB so aus

    log("1");
    foo();
    log("2");
    bar();
    log("3");
    baz();
    log("4");
    //...
    

    Wenn dann in deiner Log-Datei zB folgendes steht

    1
    2

    dann weisst du, dass dir in bar() das Programm abgestürzt ist. Dann gehst du halt zu bar() und machst dort genau das gleiche. Solange bis du die Codezeile mit dem Fehler exakt kennst.



  • Ich hab ein ähnliches Problem.

    Mein Programm ist ungefähr so strukturiert:

    #includes
    ifdefs
    defines
    Datentypen
    Vorwärtsdefinitionen aller implementierten Funktionen
    globale Variablen
    implementation der Funktionen
    

    bei den globalen Variablen steht

    bool g_wireframe = false;
    

    und in einer der Funktionen (Keypressed Behandlung) mach ich folgendes:

    switch (key){
       ...
       case 'w':
       case 'W':
          g_wireframe != g_wireframe;
          if (g_wireframe)
              glPolygoneMode(GL_FRONT_AND_BACK,GL_LINE);
          else glPolygoneMode(GL_FRONT_AND_BACK,GL_FILL);
          break;
       ...
    }
    

    Leider wird anscheinend g_wireframe niemals geändert, bzw. OpenGL ändert niemals den PolygoneMode (was nur an der Variable hängen kann. Da bin ich mir sicher).
    Da ich anscheinend net qualifiziert genug bin mein Visual Studio an der Stelle zum halten zu bringen (bin eigentlich Delpher, da geht sowas mit einem klick) gibts für mich nur 2 Möglichkeiten:
    1. Die behandlung von "w" wird niemals erreicht oder
    2. Die Breakpoints gehen net.

    Für ersteres spricht, das der Compiler mal was von Seiteneffekt erwartet gefaselt hat (jetzt net mehr). Für zweites spricht, dass ein Breakpoint in einer immer wieder aufgerufenen Funktion niemals anspringt.

    Könnt ihr mir weiterhelfen? Danke



  • Kev schrieb:

    Leider wird anscheinend g_wireframe niemals geändert

    LOL. Nun das liegt daran, dass es die logische Negation (!) nicht als Assignment Operator gibt. Wird es auch nicht geben, da dies schon der Operator für die Prüfung auf Ungleichheit ist. Du willst wahrscheinlich eher sowas

    g_wireframe = !g_wireframe;
    


  • Ja habe ich heute auch raus gefunden. Danke trotzdem.



  • @groove

    ich benutze nen borland compiler. ich mach das dann per hand im dos modus geb ich dann bcc32 -tWC quelldatei.cpp ein. ;o)

    der dev bla ist sicherlich auch english oda?

    mfg david

    ps: zu meinem problem was eigentlich der grund dieses threads ist, weiß ich schon bei welcher codezeile er sich aufhängt. und das habe ich durch auskommentieren herausgefunden. er kann einfach nicht diese globale instanz der klasse "adresse" anlegen.


Anmelden zum Antworten