Grundlegende Frage zu constanten



  • Hallo,

    leider hat die suchfunktion mir bei diesem Problem nicht wirklich weitergeholfen, ich hoffe ihr könnt dies.

    Ich habe folgenden Delphi code den ich in c++ umsetzen muss.

    CONST
     SetBits : ARRAY[0..15] OF WORD = (
                                       $0001,$0002,$0003,$0004,
                                       $0010,$0020,$0030,$0040,
                                       $0100,$0200,$0300,$0400,
                                       $1000,$2000,$300,$4000
                                      );
    

    Meine cpp implimentation sah so aus (klappt aber nicht)

    const WORD wsSetBits[16] =	{ 
    						0x0001,0x0002,0x0004,0x0008,
    						0x0010,0x0020,0x0040,0x0080,
    						0x0100,0x0200,0x0400,0x0800,
    						0x1000,0x2000,0x4000,0x8000
    					};
    

    hoffe ihr könnt mir da helfen!



  • Dennis76 schrieb:

    hoffe ihr könnt mir da helfen!

    Hoffe, du kannst den Fehler auch noch etwas genauer als "klappt aber nicht" beschreiben.



  • Sicherlich 😉

    hier die Fehlerausgabe:

    BitSet.h(33) : error C2059: Syntaxfehler: '{'
    BitSet.h(33) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    BitSet.h(39) : error C2059: Syntaxfehler: '{'
    BitSet.h(39) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    BitSet.cpp(53) : error C2065: 'wsSetBits': nichtdeklarierter Bezeichner
    BitSet.cpp(69) : error C2065: 'wsResetBits': nichtdeklarierter Bezeichner
    BitSet.cpp(108) : error C3861: 'wsSetBits': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    BitSet.cpp(124) : error C3861: 'wsSetBits': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden



  • vermutlich entweder

    #include <windows.h>
    

    oder WORD selber definieren



  • Huhu,

    es ist ja nicht so als ob WORD nicht definiert ist.

    ich denke es hat etwas damit zutun das das nicht in die Header-Datei gehört 😞



  • Bist Du Dier da 100% sicher? Was passiert wenn Du statt WORD mal int oder short schreibst?



  • Bei mir klappt folgendes ohne Probleme:

    test.h

    typedef short WORD;
    const WORD wsSetBits[16] = {
                            0x0001,0x0002,0x0004,0x0008,
                            0x0010,0x0020,0x0040,0x0080,
                            0x0100,0x0200,0x0400,0x0800,
                            0x1000,0x2000,0x4000,0x8000};
    

    test.cpp

    #include <iostream>
    #include "test.h"
    
    using namespace std;
    
    int main()
    {
        cout<<wsSetBits[0]<<endl;
    	cin.get();
    }
    


  • Hi,

    folgender code ergibt diese meldung: BitSet.h(33) : error C2059: Syntaxfehler: '{'

    em das ganze ist in einer class implimentiert

    #pragma once
    
    class CBitSet
    {
    public:
    	CBitSet(void);
    	~CBitSet(void);
    
    private:
    
    	const WORD wSetBits[16] =	{0x0001,0x0002,0x0004,0x0008,
    								0x0010,0x0020,0x0040,0x0080,
    								0x0100,0x0200,0x0400,0x0800,
    								0x1000,0x2000,0x4000,0x8000};
    
    	const WORD wResetBits[16] ={0xFFFE,0xFFFD,0xFFFB,0xFFF7,
    								0xFFEF,0xFFDF,0xFFBF,0xFF7F,
    								0xFEFF,0xFDFF,0xFBFF,0xF7FF,
    								0xEFFF,0xDFFF,0xBFFF,0x7FFF};
    };
    


  • Dennis76 schrieb:

    em das ganze ist in einer class implimentiert

    Achso, dann kannst Du das so machen:

    #pragma once
    
    class CBitSet
    {
    public:
        CBitSet(void);
        ~CBitSet(void);
    
    private:
        static const WORD wSetBits[];
        static const WORD wResetBits[];
    };
    
    //folgendes kann auch in die cpp-Datei
    const WORD CBitSet::wSetBits[] = {0x0001,0x0002,0x0004,0x0008,
                                    0x0010,0x0020,0x0040,0x0080,
                                    0x0100,0x0200,0x0400,0x0800,
                                    0x1000,0x2000,0x4000,0x8000};
    
    const WORD CBitSet::wResetBits[] = {0xFFFE,0xFFFD,0xFFFB,0xFFF7,
                                    0xFFEF,0xFFDF,0xFFBF,0xFF7F,
                                    0xFEFF,0xFDFF,0xFBFF,0xF7FF,
                                    0xEFFF,0xDFFF,0xBFFF,0x7FFF};
    


  • Achso, könntest du das evtl. etwas genauer erläutern?

    Mfg

    Dennis


  • Mod

    nur integrale static konstanten dürfen innerhalb der klassendefinition definiert werden. was du hier hast ist ein array - dass muss dann ausserhalb (und nicht im header) definiert (und initialisiert) und in der klassendefinition nur deklariert werden, siehe obiges beispiel von nillable.



  • camper schrieb:

    dass muss dann ausserhalb (und nicht im header) definiert (und initialisiert) und in der klassendefinition nur deklariert werden

    Das kann auch in der header-Datei gemacht werden, aber muss ausserhalb der Klassendefinition stehen.

    static const
    

    deshalb, weil du wahrscheinlich willst, dass es für alle CBitSet-Instanzen const ist und nicht für jeweils eine. Member die einfach nur const sind müssen in der Initialisierungsliste des Konstruktors initialisiert werden.


  • Mod

    nillable schrieb:

    Das kann auch in der header-Datei gemacht werden, aber muss ausserhalb der Klassendefinition stehen.

    falls diese klasse in mehr als einem modul verwendet wird, verletzt das aber die ODR und wird für gewöhnlich mit linkerfehlern bestraft.



  • Ok soweit so gut 🙂

    Letzte Frage: was sind "integrale static konstanten"?

    Mfg

    Dennis76


  • Mod

    Dennis76 schrieb:

    Ok soweit so gut 🙂

    Letzte Frage: was sind "integrale static konstanten"?

    Mfg

    Dennis76

    static und konstant dürfte wohl klar sein 🙂
    integral ist synonym für integer typen - also int, char, short, long (gegebenenfalls signed/unsigned), ausserdem bool und wchar_t.
    ausserdem dürfen enums so initilisiert werden.



  • Ok alles klar herzlichen dank an alle Beteiligten!

    Mfg

    Dennis

    P.S.

    Ist der Thread nicht etwas für die FAQ?!


Anmelden zum Antworten