GCC Linux: Array als Parameter uebergeben



  • Habe aerger mit dem folgenden codeschnipsel...

    class ByteArray
    {
        private:
            int len;
            unsigned char *buf;
    
        public:
            //Default Constructor
            ByteArray::ByteArray(void)
            {
                len = 0; buf = NULL;
            }
    
            ByteArray::ByteArray(const unsigned char *src )
            {
                len = sizeof(src)/sizeof(unsigned char);
                memcpy(buf, src, len);
            }
    
            //Copy Constructor
            ByteArray::ByteArray(const ByteArray& src)
            {
                len = src.len;
                buf = new unsigned char(len);
                memcpy(buf, src.buf, len);
            }
    
            //= Operator
    
            //Destructor
    
    };
    
    void _ExampleByteArray(void)
    {
        ByteArray a;
        unsigned char ba[]={0x30, 0x40, 0x50};
        ByteArray b(&ba);
    }
    

    Problem ist die uebergabe der variablen ba an den konstruktor von ByteArray.
    da gibts aerger mit der typpruefung.

    any ideas?



  • Zum ersten: warum ist im Konstruktor ein const dabei, wenn du das Array doch sowieso kopierst?

    Zum zweiten: lass den & beim Konstruktoraufruf vorm Parameter weg. Ein unsigned char[] kann man auch problemlos als unsigned char * behandeln.

    Zum dritten: Deine sizeof-Berechnugn wird nicht klappen. Damit berechnest du nur die Größe eines unsigned char * (4 auf jedme normalen 32-Bit-System). Die Arraygröße musst du schon als zweiten Parameter mitgeben lassen, C/C++ speichert keine Arraylängen.

    Zum vierten: memcpy arbeitet Byteweise, wenn ich mich nicht irre, also nicht durch die größe eines unsigned char teilen (was bei unsigned chars speziell egal ist, nicht aber z.B. bei integers).

    [ Dieser Beitrag wurde am 02.06.2003 um 00:33 Uhr von TriPhoenix editiert. ]



  • Original erstellt von TriPhoenix:
    Zum ersten: warum ist im Konstruktor ein const dabei, wenn du das Array doch sowieso kopierst?

    stimmt.
    jedoch: mache ich immer so. wenn ich etwas nicht veraendern muss, schreibe ich automatisch const.

    Zum zweiten: lass den & beim Konstruktoraufruf vorm Parameter weg. Ein unsigned
    char[] kann man auch problemlos als unsigned char * behandeln.

    ok.

    Zum dritten: Deine sizeof-Berechnugn wird nicht klappen. Damit berechnest du nur die Größe eines unsigned char * (4 auf jedme normalen 32-Bit-System). Die Arraygröße musst du schon als zweiten Parameter mitgeben lassen, C/C++ speichert keine Arraylängen.

    ich dachte ich haette die groesse dea arrays mit sizeof(src) angegeben. oder meinst du das ich damit lediglich die groesse des pointers oauf das array bestimme. wenn ja - waere dann sizeof(*src) besser?

    Zum vierten: memcpy arbeitet Byteweise, wenn ich mich nicht irre, also nicht durch die größe eines unsigned char teilen (was bei unsigned chars speziell egal ist, nicht aber z.B. bei integers).

    ich dachte ein unsigend char belegt genau ein byte.

    p.s. wie waere es denn zu loesen *duck*



  • Original erstellt von Belgarad:
    **
    jedoch: mache ich immer so. wenn ich etwas nicht veraendern muss, schreibe ich automatisch const.
    **

    das ist auch gut so, ich versteh den Einwand auch nicht.

    Zum zweiten: lass den & beim Konstruktoraufruf vorm Parameter weg. Ein unsigned
    char[] kann man auch problemlos als unsigned char * behandeln.
    **
    ok.
    **

    genau das isses

    **
    ich dachte ich haette die groesse dea arrays mit sizeof(src) angegeben. oder meinst du das ich damit lediglich die groesse des pointers oauf das array bestimme. wenn ja - waere dann sizeof(*src) besser?
    **

    Es gibt keine Möglichkeit, die Größe des Arrays über den Pointer herauszubekommen. Du müßtest die Größe als zusätzlichen Parameter mit übergeben.



  • Das mit const war ein Denkfehler von mir, sorry 🙂

    Original erstellt von Belgarad:
    **ich dachte ein unsigend char belegt genau ein byte.
    **

    Ja, aber wenn du das unter der annahme schreibst, kannst dus auch gleich weglassen. Das funzt nämlich nur solange bei sizeof(...) 1 byte auch rauskommt. Wenn du anstatt dessen ein Array aus ints hättest z.B. würdest du nur 1/4 des benötigten Platzes alloziieren und *peng* gibts ne schutzverletzung 🙂

    Und ansonsten wie Bashar es sagte, du musst die Arraygröße mitgeben, da hilft nichts.



  • du solltest übrigens zur Initalisierung von Elementen im Konstruktor lieber Initalisierungslisten benutzen, zwar ist bei trivialen Objekten der Unterschied zwischen Zuweisung und Initalisierung nicht (unbedingt) vorhanden, aber man sollte sich das IMHO direkt angewöhnen und außerdem kann man das IMHO besser lesen

    void _ExampleByteArray(void)
    

    btw. ist dieser Funktionsname laut Standard nicht erlaubt, das _+großer Buchstabe für den Compiler exklusiv ist



  • Original erstellt von kingruedi:
    **du solltest übrigens zur Initalisierung von Elementen im Konstruktor lieber Initalisierungslisten benutzen, zwar ist bei trivialen Objekten der Unterschied zwischen Zuweisung und Initalisierung nicht (unbedingt) vorhanden, aber man sollte sich das IMHO direkt angewöhnen und außerdem kann man das IMHO besser lesen

    void _ExampleByteArray(void)
    

    btw. ist dieser Funktionsname laut Standard nicht erlaubt, das _+großer Buchstabe für den Compiler exklusiv ist**

    Wie wuerde den bei dem o.g. Beispiel eie Initialisierungsliste ausehen?

    P.s. danke fuer den Hinweis auf den Funkionsnamen.

    P.s.2: Interessant was man bei so einem kleinen schnipsel code noch alles lernen kann....



  • Original erstellt von Belgarad:
    **Wie wuerde den bei dem o.g. Beispiel eie Initialisierungsliste ausehen?
    **

    ByteArray::ByteArray(void): len(0), buf(0) { }
    


  • Danke! - habs jetzt mit den initialisierungslisten verstanden.


Anmelden zum Antworten