Zugriff auf Hi-Byte eines Int über Pointer.

Gast #691515
Hallo, ich weis nicht wo mein Denkfehler liegt.
Mit folgender Funktion bin ich wunschlos glücklich, sie liefert mir das 
Hi-Byte eines Integers zurück.
1
unsigned char gethibyte(unsigned int * integer)
2
{
3
    unsigned char * ptr;
4
    ptr=(unsigned char*)&integer;
5
    ptr++;
6
    return *ptr;
7
}

Jetzt wollte ich in ähnlicher Weise das Highbyte verändern und dachte 
dasfolgende kleine Änderung hilfreich sein wird..
1
void puthibyte(unsigned int *integer, unsigned char Value)
2
{
3
    unsigned char * ptr;
4
    ptr=(unsigned char*)&integer;
5
    ptr++;
6
    *ptr=Value;
7
}

Leider funktioniert das so nicht. Ich frage mich aber warum? In der 
oberen Fkt. gebe ich den Wert auf den der Pointer zeigt zurück und in 
der unteren möchte ich gerne einfach den Wert verändern. Jedoch 
verändert sich bei mir nix.


Weis jemand rat?

Benutzte MPLAB IDE 7.51 + C18 Compiler mit PIC 18F2550

Vielen Dank
FFJaro wrote:

>
1
void puthibyte(unsigned int *integer, unsigned char Value)
2
> {
3
>     unsigned char * ptr;
4
>     ptr=(unsigned char*)&integer;
5
>     ptr++;
6
>     *ptr=Value;
7
> }
>
> Leider funktioniert das so nicht.

Der Code ist in Ordnung, sofern die Reihenfolge im Speicher
zuerst Low-Byte und dann High-Byte lautet. Aber das hast
du wohl schon im Vorfeld abgeklärt.

Dein Fehler muss also woanders liegen.
Persönliche Seite
Es ist Zufall, dass deine Lösung funktioniert. Du machst nämlich 
implizit Annahmen wie die Bytes im Speicher abgelegt sind und das ist 
nicht auf allen Maschinen gleich. Stichwort Endianess

http://www.mikrocontroller.net/articles/Digitaltechnik#Endianness

Portabler wäre etwas in der Art...
1
unsigned char gethibyte(unsigned int *integer)
2
{
3
    return *integer >> 8;
4
}
1
void puthibyte(unsigned int *integer, unsigned char Value)
2
{
3
    *integer = ((unsigned int)Value << 8) | (*integer & 0x00FF);
4
}
Gast
Das ist doch schon ein Pointer. Nur noch den Typ ändern auf den er zegit
1
void puthibyte(unsigned int *integer, unsigned char Value)
2
{
3
    ((unsigned char*)integer)[1] = Value;
4
}

;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.