typedef und pointer



  • Hallo zusammen,

    ich habe ein Verständnisproblem mit Pointern und typedefs.
    Es geht um folgenden Codeabschnitt:

    unsigned char a[10];
    	unsigned char *b=a;
    	a[0]++;
    	b[0]--;
    

    Dieser kompiliert einwandfrei.

    Dasselbe mit Typedefs:

    typedef unsigned char tSha1Hash[20];
    tSha1Hash c;
    	tSha1Hash *d=c;
    	c[0]++;
    	d[0]--;
    

    Bringt den Fehler:

    error: cannot convert âunsigned charâ to âunsigned char ()[20]â in initialization

    (Fehler in der Zeile

    tSha1Hash *d=c;

    )

    Wenn ich allerdings folgendes tue,

    tSha1Hash c;
    	tSha1Hash *d=&c;
    	c[0]++;
    	d[0]--;
    

    erhalte ich die Fehlermeldung
    error: cast to non-reference type used as lvalue
    error: invalid lvalue in assignment
    in der Zeile mit

    d[0]--;
    


  • b ist ein pointer auf unsigned char, d ist ein pointer auf ein array von unsigned char. Der typedef geht auf den gesamten Ausdruck, also inclusive des Array. Und dass die beiden nicht kompatibel sind sagt die Compilermeldung 🙂



  • Achso, danke !

    Nur was kann ich tun?
    Mein eigentliches Problem ist folgendes:

    typedef unsigned char tSha1Hash[20];
    
    fillvalues(unsigned char *wert); // vorgegebene Funktion vom Betriebssystem
    
    void foo(tSha1Hash *outHashValue) {
       unsigned char xywerte[3000];
       fillValues(xywerte);
    // rückgabe der Werte an outHashValue:
    	for(unsigned int i = 0; i < SHA1_SIZE; i++) 
    		outHashValue[i]=md_value[i];
    }
    

    Bei der Zuweisung, dann:

    error: incompatible types in assignment of âunsigned charâ to âunsigned char [20]â

    Denke mir ist klar woher der Fehler kommt, nurwie kann ich ihn vermeiden?

    😕



  • Unter C++ kannst Du hervorragend eine Referenz auf das Array übergeben:

    void foo(tSha1Hash &outHashValue) {
       unsigned char xywerte[3000];
       fillValues(xywerte);
    // rückgabe der Werte an outHashValue:
        for(unsigned int i = 0; i < SHA1_SIZE; i++)
            outHashValue[i]=md_value[i];
    }
    

    (Alternativ kannst Du den Zeiger-auf-das-Array zu einem Array dereferenzieren:

    void foo(tSha1Hash *outHashValue) {
       unsigned char xywerte[3000];
       fillValues(xywerte);
    // rückgabe der Werte an outHashValue:
        for(unsigned int i = 0; i < SHA1_SIZE; i++)
            (*outHashValue)[i]=md_value[i];
    }
    

    )


Anmelden zum Antworten