mikrocontroller.net

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


Autor: FFJaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned char gethibyte(unsigned int * integer)
{
    unsigned char * ptr;
    ptr=(unsigned char*)&integer;
    ptr++;
    return *ptr;
}

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

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

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider funktioniert das so nicht

Das heißt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FFJaro wrote:

>
void puthibyte(unsigned int *integer, unsigned char Value)
> {
>     unsigned char * ptr;
>     ptr=(unsigned char*)&integer;
>     ptr++;
>     *ptr=Value;
> }
>
> 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/Digitaltec...

Portabler wäre etwas in der Art...
unsigned char gethibyte(unsigned int *integer)
{
    return *integer >> 8;
}
void puthibyte(unsigned int *integer, unsigned char Value)
{
    *integer = ((unsigned int)Value << 8) | (*integer & 0x00FF);
}

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch schon ein Pointer. Nur noch den Typ ändern auf den er zegit
void puthibyte(unsigned int *integer, unsigned char Value)
{
    ((unsigned char*)integer)[1] = Value;
}

;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.