Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Hi-Byte eines Int über Pointer.


von FFJaro (Gast)


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

von ARM-Fan (Gast)


Lesenswert?

>Leider funktioniert das so nicht

Das heißt?

von Karl H. (kbuchegg)


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.

von Stefan B. (stefan) Benutzerseite


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
}

von Werner B. (Gast)


Lesenswert?

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
}

;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.