bitshifting mit zeigern? und noch mehr -> ????? <-



  • Hallo, hab da ein kleines Problem: 😃

    ich habe eine Funktion, an die wird ein zeiger zurückgegeben.

    Beispiel:

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       zeiger = zeiger >> 1;
       return 1337;
    }
    

    macht er nicht....

    auch...

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       unsigned int test = *zeiger;
       test = test >> 1;
       zeiger = test;
       return 1337;
    }
    

    macht er auch nicht.

    Er sagt mir immer, >> ist ein falscher operator fuer Pointer....Oo
    und im unteren Beispiel weiss ich halt nicht, wie ich überhaupt den Zeiger 'zeiger' einfach auf eine andere Variable 'test' zeigen lassen kann??

    Also ich will den Wert des Integers, auf den der Zeiger zeigt, auch verändern,
    aber mit der funktion etwas anderes zurückgeben.

    Danke fuer die Hilfe...cu



  • Dir ist klar, dass du komplett falsche Zuweisungen machst, oder?

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       zeiger = zeiger >> 1;
       return 1337;
    }
    

    kann nicht funktionieren, weil zeiger >> 1 den gespeicherten Wert von "zeiger" shiftet, nicht den gespeicherten Wert an der Stelle, auf die "zeiger" zeigt, d.h. du schifftest mehr oder wenig die Adresse. Außerdem ist shiften bei Pointers nicht gültig.

    Um den Inhalt zu shiften:

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       *zeiger = *zeiger >> 1;
       return 1337;
    }
    

    Bei

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       unsigned int test = *zeiger;
       test = test >> 1;
       zeiger = test;
       return 1337;
    }
    

    ist die Anweisung zeiger = test; falsch, denn "zeiger" ein unsigned int* ist und test ein unsigned int, d.h. "zeiger" ist ein Zeiger, test nur eine Variable. zeiger= test; heißt, "Zeiger zeiger musst jetzt auf die Stelle test zeigen".

    Um den Inhalt zu speichern:

    unsigned int shifte_es_mir(unsigned int *zeiger)
    {
       unsigned int test = *zeiger;
       test = test >> 1;
       *zeiger = test;
       return 1337;
    }
    

    edit: wenn du bei deinen 2. Code aber die Adresse, auf die "zeiger" zeigt ändern willst, dann musst du einen doppelpointer übergeben:

    unsigned int shifte_es_mir(unsigned int **zeiger)
    {
       unsigned int test = **zeiger;
       test = test >> 1;
       *zeiger = &test;
       return 1337;
    }
    


  • supertux schrieb:

    edit: wenn du bei deinen 2. Code aber die Adresse, auf die "zeiger" zeigt ändern willst, dann musst du einen doppelpointer übergeben:

    unsigned int shifte_es_mir(unsigned int **zeiger)
    {
       unsigned int test = **zeiger;
       test = test >> 1;
       *zeiger = &test;
       return 1337;
    }
    

    Das ergibt aber UB, denn test ist nach Verlassen der Funktion tot. *zeiger verweist aber weiterhin darauf.

    Wenn du den Zeiger ändern willst, dann musst du das anders machen. Zuerst suchst du dir mal einen Ganzzahl Typ, der der Zeigerbreite auf der entsprechenden Plattform entspricht. ZB für gängige x86-32 Systeme

    typedef unsigned int int_ptr_type;
    

    Der wird dann in entsprechender Funktion benutzt

    unsigned int shifte_es_mir(unsigned int **zeiger)
    {
        int_ptr_type tmp = (int_ptr_type) *zeiger;
        tmp >>= 1;
        *zeiger = (unsigned int *) tmp;
        return 1337;
    }
    


  • jo super, danke. mein Prog funzt nun.

    umcasten hab ich auch verstanden (wie und warum).p

    aber koenntest du mir bitte erklaeren, warum man einen doppelpointer
    übergeben muss?

    THX



  • suboptimiert schrieb:

    aber koenntest du mir bitte erklaeren, warum man einen doppelpointer
    übergeben muss?

    Zeiger werden ja auch nur by-value übergeben, dh als eine lokale Kopie. Du hast somit keine Zugriffsmöglichkeit auf die Originalvariable.


Anmelden zum Antworten