Seltsames Verhalten bei simpler Zuweisung (BCB)



  • Hallo,

    seit kurzem beschäftigt mich ein Phänomen für das ich keine Erklärung habe.

    In einer Datei habe ich eine globale Variable, die irgendwann auch einen Wert bekommt. Der Wert dieser soll nun an anderer Stelle im Projekt ganz simpel einer anderen Variable zugewiesen werden.

    void Dummy::Foo(){
        int local;    
        local= global;    // hier geht's schief
        ...
    }
    

    Folgendes ist zu beobachten:

    1. Die neudeklarierte (lokale) Variable hat schon während der Deklaration einen Wert(z.B 35)
    2. Nach Zuweisung des Wertes von der Globalen hat diese "neue" Variable dann immer noch den ursprünglichen Wert(i.d.F. 35)

    Ich habe dieses Phänomen schon anderen gezeigt, denen das auch sehr spanisch vorkommt.
    Hat jemand hier sich schon mal mit einer ähnlichen Situation auseinandersetzen müssen?
    Und -noch wichtiger- wo liegt der Fehler?
    Und- noch viel wichtiger- wie kann ich diesen beseitigen?

    Danke für konstruktive Beiträge



  • Hi,

    was sagt der Debugger? Welchen Wert haben die beiden Variablen vor(!) und nach der Zuweisung?
    Stimmt der angezeigte Wert und Adresse der globalen Variable ausserhalb und innerhalb Deiner Funktion? Bist Du sicher, dass Du den Wert der globalen Variable nicht an anderer Stelle z.B. durch eine Bereichspberschreitung eines Arrays überschreibst?

    Jochen



  • Oh schon jemand der sich meldet...

    also:

    Welchen Wert haben die beiden Variablen vor(!) und nach der Zuweisung?

    global hat den Wert 100;
    local hat vor und nach der Zuweisung den Wert 1539460

    Stimmt der angezeigte Wert und Adresse der globalen Variable ausserhalb und innerhalb Deiner Funktion?

    Tja, das ist auch seltsam. Der Wert stimmt überein, aber beim Versuch nur die Adresse zu übergeben zeigt der Debugger ???? an.

    Aber warte mal...
    Die globale Variable ist eine Klasse und ich will auf Member-Variablen der Klasse zugreifen. Kann das sein, dass ich das dann entsprechend anders anpacken muss???



  • PosSeX schrieb:

    Die globale Variable ist eine Klasse und ich will auf Member-Variablen der Klasse zugreifen. Kann das sein, dass ich das dann entsprechend anders anpacken muss???

    Ja musst du.

    In etwa so

    int local = deineKLasse->getGlobal();
    

    wobei getGlobal() int zurückgibt.



  • PosSeX schrieb:

    [...]
    Die globale Variable ist eine Klasse [...]

    😕 Öhm, ist das jetzt eine Klasse oder eine Variable???
    Weil beides geht glaube ich nicht.



  • na anständiger OOP ist das eine öffentliche Mitgliedsfunktion die den Inhalt einer privaten Variable (hier vom Typ Int) zurückliefert...



  • Naja, ist halt ein Objekt welches global ist.
    Ich weiß, nicht schön und arbeite auch gerade daran das schöner hinzubiegen(Stichwort: Singleton)

    @PuppetMAster2k:
    Soweit bin ich schon, dass ich deinen Vorschlag auch so hinbekommen hätte/habe, wenn es denn funzen würde. 😃

    @FrankHof:
    ich weiß... Klasse kommt nicht von mir 😞 Und drin rumpfuschen will ich vorerst nicht.

    Hofmann_Till schrieb:

    Weil beides geht glaube ich nicht.

    Erläuter mal...vielleicht bringt mich das näher ans Prob.

    Danke

    Es macht im Übrigen keinen Unterschied, ob es ein Objekt irgendeiner Klasse oder eine "Variable" eines Basistypen ist.

    Ich kann es vielleicht noch detaillierter beschreiben:
    Bei versuchter Verwendung der Variablen/des Objektes außerhalb von Klassenfunktionen funktioniert alles reibungslos. Lediglich innerhalb gibt's Probleme. Der Compiler macht keine Zicken(auch keine Warnungen)



  • allein schon dass das compiliert ohne errors und warnings ist komisch...



  • Naja, eine Variable kann keine Klasse sein. Entweder global ist eine Klasse oder eine Variable oder global steckt in einer Klasse.

    Sieht die Klasse so aus???

    class Klasse
    {
    private:
    public:
    int global;
    };
    

    Und du sagst, du kannst von Extern auf die Variable zugreifen, aber nicht, wenn du eine Funktion/Prozedur in der Klasse schreibst?



  • PosSeX schrieb:

    [...]
    Die globale Variable ist eine Klasse [...]

    Wenn die Variable "global" eine Instanz einer Klasse ist, ist es unklar, was der Zuweisungs-Operator überhaupt bewirkt. Etwas mehr Informationen über die betreffende Klasse und die Definition von "global" könnten vielleicht hilfreich sein.



  • Ich zeig's noch mal auf:

    In File1.cpp steht:

    ClassX objX;    //ist in File1.hpp als extern ClassX objX deklariert;
    ...
    
    AndereKlasse::AndereKlasse()
    {
       objX.Attrib1=42;
       ...
    }
    
    ...
    

    in File2.cpp dann:

    #include "File1.hpp"
    ...
    GanzAndereKlasse::GanzAndereKlasse(...)
    {
       int bla=objX.Attrib1;    // und hier kackt er rum (Attrib ist integer)
       ...
    }
    ...
    

    und hier noch mal ClassX.hpp

    class ClassX
    {
       public:
           int Attrib1;
           int Attrib2;
           ...
    };
    

    Kein operator=, oder sonst irgendwelche Sachen innerhalb ClassX



  • HI,
    mach doch objX als public in AndereKlasse und greife dann durch AndereKlasse.objX.Attrib1 darauf zu...

    MfG

    Alexander Sulfrian

    PS: Den FAQ Artikel zu piblic Variablen kennst du schon, oder?



  • Ist ne Möglichkeit, hier allerdings etwas ungünstig.
    Ich benötige die Attrib1 ... AttribN in fast allen anderen Programmteilen(u.a. in Threads).

    AndereKlasse soll aber mit den anderen Teilen nichts zu tun haben(ist ne TForm).

    Ich versuchs gerade mitm Singleton-Pattern...denke/hoffe das haut hin



  • PosSeX schrieb:

    in File2.cpp dann:

    #include "File1.hpp"
    ...
    GanzAndereKlasse::GanzAndereKlasse(...)
    {
       int bla=objX.Attrib1;    // und hier kackt er rum (Attrib ist integer)
       ...
    }
    ...
    

    Muss das da nicht #include "File1.h" heißen???


Anmelden zum Antworten