mikrocontroller.net

Forum: Compiler & IDEs eeprom_read_byte( uint8_t* ), warum ein zeiger uint8_t


Autor: Werner H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Folgendes habe ich im GCC-Tutorial gefunden.
uint8_t EEPReadByte(uint16_t addr)
{
  return eeprom_read_byte((uint8_t *)addr);
}
Aber warum aus addr ein Zeiger auf einen uint8_t gemacht?
Die EEProm-Adressen haben doch mehr als 8 bit! es müsste daher doch ein 
Zeiger auf ein uint16_t sein oder ist das wurst, weil Zeiger 
Speicheradressen speichern und diese sind immer gleich lang?!

Oder habe ich hier grundlegend etwas falsch vertanden?

Vielen Dank
Werner

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die EEProm-Adressen haben doch mehr als 8 bit!

Aber die Daten im EEPROM sind Bytes. Die 16-Bit-Adresse (beachte: addr = 
uint16_t) zeigt auf ein Byte (uint8_t *) im EEPROM.

Autor: Werner H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Aber die Daten im EEPROM sind Bytes.
Dann müsste es
 return (uint8_t)eeprom_read_byte(addr);
lauten. Oder etwa nicht?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner H. schrieb:
>> Aber die Daten im EEPROM sind Bytes.
> Dann müsste es
 return (uint8_t)eeprom_read_byte(addr);
> lauten. Oder etwa nicht?

Warum? eeprom_read_byte gibt ein uint8_t zurück. Welchen Sinn soll es 
machen, ein uint8_t in ein uint8_t zu casten?

Und warum lässt du den Cast bei addr weg? Der macht aus dem 
16-Bit-Integer einen Zeiger.

Autor: Michael Buesch (mb_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner H. schrieb:
> Oder habe ich hier grundlegend etwas falsch vertanden?

Jo. Arbeite in deinem C Buch nochmal das Kapitel "Zeiger" durch.

uint8_t* ist ein Zeiger und er speichert eine Adresse eines uint8_t. 
(Kein uint8_t selber)

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

Bewertung
0 lesenswert
nicht lesenswert
Werner H. schrieb:
> Hallo zusammen,
>
> Folgendes habe ich im GCC-Tutorial gefunden.
>
> uint8_t EEPReadByte(uint16_t addr)
> {
>   return eeprom_read_byte((uint8_t *)addr);
> }
> 
> Aber warum aus addr ein Zeiger auf einen uint8_t gemacht?
> Die EEProm-Adressen haben doch mehr als 8 bit! es müsste daher doch ein
> Zeiger auf ein uint16_t sein oder ist das wurst, weil Zeiger
> Speicheradressen speichern und diese sind immer gleich lang?!

Der Compiler weiß schon wie lang Pointer (und damit Adressen) sind. Das 
braucht man ihm nicht sagen.
Aber bei Adressen ist interessant: An der Stelle im Speicher, von der 
man die Adresse hat, was genau liegt den dort im Speicher?

In deinem Fall: ein uint8_t

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.