struct initialisieren ?



  • Hallo
    bei folgendem Beispiel bekomme ich die Fehlermeldung 'Klassenelement kann hier nicht initialisiert werden'.
    Wie initialisiere ich solch eine Struktur ??

    struct DdsLoadInfo {
      bool compressed;
      bool swap;
      bool palette;
      unsigned int divSize;
      unsigned int blockBytes;
      GLenum internalFormat;
      GLenum externalFormat;
      enum type{};
    };
    
    DdsLoadInfo loadInfoBGR5A1 = {false, true, false, 1, 2, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV};
    .
    .
    .
    


  • Hallo

    du brauchst für die Initialisierung der struct-Werte einen Konstruktor für den struct-typ, wie bei einer Klasse.

    bis bald
    akari



  • danke, wäre es möglich, dies mir an einem Beispiel zu zeigen ?? Ist etwas verwirrend in der Online Hilfe.



  • Hallo

    sorry, da hab ich wohl falsch gelegen. Das sollte auch so gehen

    struct DdsLoadInfo {
      bool compressed;
      bool swap;
      bool palette;
      unsigned int divSize;
      unsigned int blockBytes;
      GLenum internalFormat;
      GLenum externalFormat;
      enum MyType{GL_UNSIGNED_SHORT_1_5_5_5_REV,... /*weiter Wert*/} MyEnum; // passende Namen für Typ des Enums und den Member des structs von Typ des Enums
    };
    
    DdsLoadInfo loadInfoBGR5A1 = {false, true, false, 1, 2, GL_RGB5_A1, GL_BGRA, DdsLoadInfo::GL_UNSIGNED_SHORT_1_5_5_5_REV};
    

    Du kannst aber trotzdem einen vernünftigen Konstruktor anfertigen.

    bis bald
    akari



  • unabhängig vom Aufzählungstyp enum kommt die gleiche Fehlermeldung. Wenn ich das so kürze funktioniert das auch nicht. 😕
    Syntax falsch ?

    struct DdsLoadInfo {
      bool compressed;
      bool swap;
      bool palette;
    };
    
    DdsLoadInfo loadInfoBGR5A1 = {false, true, false};
    


  • Hallo

    bei mir (BCB 5) wird auch dein letztes Beispiel korrekt kompiliert und ausgeführt. DU must mal schauen, ob du nicht woanders noch einen Fehler hast, der erst dort an dieser Stelle vom Compiler gemerkt wird.

    bis bald
    akari



  • ich habe BCB6 und nur als test diesen code, also nix anderes noch.
    Felermeldung E2233

    Einzelne Elemente einer Struktur, Union oder Klasse in C++ können keine Initialisierer haben.

    Eine Struktur oder Union kann als Ganzes mit Initialisierungswerten in geschweiften Klammern initialisiert werden.

    Eine C++ Klasse kann nur durch einen Konstruktor initialisiert werden.

    Also ich habe das in die 'public:// Anwender-Deklarationen' geschrieben.



  • Hallo

    ah... jetzt kommen wir der Sache schon näher, du darfst sowas nicht in einer Klasse (dem Form in diesem Fall) machen. Dazu must du wie schon gesagt Konstruktoren einsetzen

    struct DdsLoadInfo {
      bool compressed;
      bool swap;
      bool palette;
      unsigned int divSize;
      unsigned int blockBytes;
      GLenum internalFormat;
      GLenum externalFormat;
      enum MyType{GL_UNSIGNED_SHORT_1_5_5_5_REV,... /*weiter Wert*/} MyEnum; 
    
      // Konstruktor des Structs mit der Initialisierungliste der einzelnen Member
      DdsLoadInfo() : compressed(false), swap(true), palette(false), int divSize(1),
        blockBytes(2), internalFormat(GL_RGB5_A1), externalFormat(GL_BGRA), 
        MyEnum(GL_UNSIGNED_SHORT_1_5_5_5_REV) {};
    };
    ...
    
    __private :
      ...
      DdsLoadInfo loadInfoBGR5A1; // Deklaration des Struct-Members des Forms
    
    // dann in der Implementaion des Konstruktors des Forms den Konstruktor 
    // für das struct-Member ausführen
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner), loadInfoBGR5A1()
    {
      }
    

    Das sind alles Grundlagen der OOP, die du auch im Builder brauchst, also solltest du dich besser damit vertraut machen

    bis bald
    akari



  • oh danke !

    was empfiehlst Du für Literatur in Bezug auf diese Dinge ??



  • Hallo

    schau einfach mal auf dieser Seite im Menü oben rechts, da sind zwei Links Bücher und Tutorials. Außerdem gibts es auch schon genug Threads zum Thema Bücher.

    bis bald
    akari



  • ok danke 🙂


Anmelden zum Antworten