Frage

Ich kann nicht verstehen, was dorthin geht. Mit Visual Studio 2008 habe ich einen Auflauf wie folgt definiert:

enum MyType{
    A,
    B,
    C
};

Dann verwende ich es, um eine Mitgliedsvariable zu initialisieren:

class MyClass
{
    private:
        bool   bit_;
        uint16 num_;
        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // This the assignment which fails
        } // Here, there's a breakpoint to query member_ value    
};

Myclass Instance = new myclass ();

Ich verwende die Debug -Konfiguration, sodass mich beim Lesen einer Variablen keine Optimierung täuschen kann. An einem Haltepunkt kurz nach der Zuordnung zeigt der Debuger den Wert von member_ als member_ = C.

Es könnte sich um ein Debugger -Auffrischungsproblem handeln, aber innerhalb einer Methode bewertet es sich bei Überprüfung:

if(member_ == C){
    // ??
}

Und auch die Zuweisung der anderen Werte gibt seltsame Zahlen, z. B. dies member_ = B gibt member_ = 258 beim Ferchen. Kannst du mir sagen, was los ist? Danke im Voraus.

Bearbeiten #1

Ich habe einen lustigen Effekt festgestellt, der erklärt, warum nach der Zuweisung member_ = A der Ausdruck member_ == C bewertet true Für die Aufzählung mit den Standardwerten:

Für die Aufzählung

enum MyType{ A, B, C}; // equivalent to enum MyType{ A = 0, B = 1, C = 2};

Ich bekomme

MyType  a = A; // but when fetching a the value is   2  (0x0002)  thats the map for C!
MyType  b = B; // but when fetching a the value is 258  (0x0102)
MyType  c = C; // but when fetching a the value is 514  (0x0202)

Aber wenn ich mache

enum MyType{ A = 5, B = 6, C = 7};

Ich bekomme

MyType  a = A; // but when fetching a the value is 1282  (0x0502)
MyType  b = B; // but when fetching a the value is 1538  (0x0602)
MyType  c = C; // but when fetching a the value is 1794  (0x0702)

Wenn Sie diese #?!^% Enum zuweisen, scheint die Regel 8 Bit zu verschieben und 2 hinzuzufügen. Es klingt nach Compiler -Problemen.

Übrigens, machen Sie die Art von member_ sein int stattdessen MyType ändert nichts.

Bearbeiten #2Zwei weitere Mitglieder in der Klasse hinzugefügt, die die wahre Ursache des Problems sind. Ich werde die Antwort veröffentlichen, sobald die Zeitbeschränkung verschwindet (8h nach der Veröffentlichung der Frage).

War es hilfreich?

Lösung 2

Vielen Dank an alle. Jemand bei der Arbeit hat mich auf den Ursprung des Problems hingewiesen.

Es handelt sich um eine fehlerhafte Konfiguration des Projekts, die Probleme mit der Datenausrichtung enthält.

Nach dem Kompilieren mit den aktuellen Projekteinstellungen sind die beiden ersten Mitglieder der Klasse 3 Bytes der Größe.

Es sollte 4 Bytes sein, daher die Fehlausrichtung von 1 Byte. Das zusätzliche 2 -zusätzliche 2 ist der Müll am falsch ausgerichteten Byte. Der gesamte Effekt besteht also darin, ein Byte zu verschieben und 2 hinzuzufügen.

Dieser Effekt wird abgehalten, ein zusätzliches Mitglied hinzugefügt, obwohl es sich nicht um eine elegante Lösung handelt (die Lösung besteht darin, das Projekt korrekt zu konfigurieren).

class MyClass
{
    private:
        bool   bit_;  // 1 byte
        uint16 num_;  // 2 byte

        bool dummy;   // extra byte to help the alignment

        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // Now it works as expected.
        }
};

Andere Tipps

Enum -Einträge müssen keine eindeutigen Werte haben. Möglicherweise haben Sie eine Aufzählung mit A, B, C, wobei sowohl A als auch C gleich '42' sind. In diesem Fall, wenn der VAR einen Wert von 42 hat, ist die IDE die IDE wird dir nur einen zeigen der passenden Einträge, a oder c, nicht beides.

Sie können problemlos eine Aufzählung mit "doppelten" Einträgen wie folgt erstellen:

enum { A=1, B=1, C=1 }

Aber höchstwahrscheinlich haben Sie es nicht so gemacht. Bei der Verwendung von AutoNumbering können Sie jedoch auch versehentlich (oder absichtlich) Duplikate erstellen:

enum { A, B, C }       // 0,1,2
enum { A, B, C=0 }     // 0,1,0
enum { A=2, B=1, C }   // 2,1,2
enum { A=-1, B, C=0 }  // -1,0,0

Stellen Sie sicher, dass Sie Ihre Enum-Definition überprüfen.

Siehe dh http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top