Zugriff auf Hi-Byte eines Int über Pointer.

Gast #691515
Lesenswert?

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
#691521
Lesenswert?

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 #691535
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren