eeprom_read_word()

Gast #100000
Ich dachte, ich hätte die EEProm Funktionen langsam verstanden aber bei
dem Quellcode:
u16 globalupdays _attribute_ ((section (".eeprom"))) = {0};
u16 uptimedays;
Und in einer Funktion dann:
uptimedays = eeprom_read_word(&globalupdays);

Gibt der Compiler eine Warnung aus: passing arg 1 of
`eeprom_read_word' form incompatible pointer type
Ersetze ich read_word durch read_byte und u16 globalupdays durch u08
globalupdays gibt es keine Warnungen.
Was habe ich falsch gemacht?
Gast
Kann ich nicht nachvollziehen:

% cat foo.c
#include <avr/eeprom.h>
#include <inttypes.h>

uint16_t eefoo;
uint16_t foo;

void
readfoo(void)
{
        foo = eeprom_read_word(&eefoo);
}
% avr-gcc -W -Wall -c -mmcu=at90s8515 -O foo.c
%
Gast
Bei meinem Beispiel fehlte zwar das _attribute_ ..., aber es ist
kein Unterschied, auch mit der korrekten Deklaration bleibt es ohne
Warnung.
Gast
Also wenn ich wie in dem Beispiel von Jörg, anstelle von u16
globalupdays mit uint16_t deklariere funktionierts ohne Warnungen.
u16 steht bei mir für unsigned short.
Wenn ich mir die inttypes.h ansehe ist uint16_t als unsigned int
definiert.
Laut
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/basic_42.asp
würde
#typedef unsigned int uint16_t;
also 4 anstelle von 2 Byte belegen, und somit aus meiner sicht genau so
viel wie
#typedef unsigned long uint32_t;
Wo wäre dann denn der Unterschied zwischen uint16_t und uint32_t? Auch
reichen mir 16 Bit.
Gast
Warum benutzt die eine Dokumentation, die nicht zum Produkt passt?
Schon mal versucht, mit ner Bedienungsanleitung vom Motorrad Auto zu
fahren? :-)

Wenn u16 bei Dir für unsigned short steht, und der Funktionsprototyp
für eeprom_read_word uint16_t verlangt, welcher mit unsigned int
deklariert wurde, dann hast Du zwei verschiedene Typen vermischt. Und
das klagt der Compiler - völlig zu recht - an.

Gruß,
Patrick...
Gast
Die [u]intNN_t Definitionen in <inttypes.h> (*) sind ja genau für den
Zweck bestimmt, daß man damit Datentypen bekommt, die unabhängig von
der zugrundeliegenden Architektur eine bestimmte Bitbreite besitzen.

Das ist C-Standard (ISO-C99 allerdings, nicht ISO-C90 alias
ANSI-C89)!

(*) Eigentlich sollten sie in <stdint.h> stehen, aber das müssen wir
erst noch machen.  <inttypes.h> zieht aber per Standard die
Definitionen aus <stdint.h> ohnehin mit rein, insofern ist das auch
zukunftssicher.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.