- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: mal wieder eine EEPROM Frage

  1. #11
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von oberallgeier Beitrag anzeigen
    pointer targets in passing argument 1 of '__eewr_word_m328p' differ in signedness
    Der Compiler hast (fast) immer Recht.

    Definition von eeprom_write_word:
    void eeprom_write_word (uint16_t *__p, uint16_t __value)

    Was gibst du rein? Einen pointer auf ein int16_t. Die Funktion erwartet ein uint16_t. Andere "signedness" In dem Fall kann das ignoriert werden.

    Gruß
    Georg

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.669
    Zitat Zitat von schorsch_76 Beitrag anzeigen
    ... Was gibst du rein? ... int16_t. Die Funktion erwartet ein uint16_t ...
    Danke Schorsch. Grad hatte ich (nochmal) nachgegrübelt, nachgesehen und war draufgekommen, dass es auch ein avr-libc-user-manual gibt mit ner site über EEPROM Handling. Und schon hatte es geklappt. Aber da hattest Du schon Deinen Hinweis gepostet. Jedenfalls - vielen Dank, die Warnungen sind abgeschaltet. Dumm, eigentlich hätte ich das Vorzeichen benötigt.

    Der Compiler hat (fast) immer Recht.
    Ciao sagt der JoeamBerg

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von oberallgeier Beitrag anzeigen
    argument 1 of '__eewr_word_m328p' differ in signedness
    Sooo schlecht sind die Meldungen vom GCC auch nicht, im Grunde ist die Lösung ganz einfach:
    PHP-Code:
    uint16_t eeprom_read_word (const uint16_t *__p
    Der Pointer ist vom Typ const unsigned int16. Dein Array besteht aus signed int16. Der Compiler bemängelt, dass der Zeiger der eigentlich auf einen vorzeichenlosen 16-Bit-Integer zeigen sollte in Wirklichkeit auf einen vorzeichenbehafteten Integer zeigt. Die Warnung ist in dem Kontext harmlos, du kannst sie durch einen Cast ruhigstellen: (uint16_t *)

    mfG
    Markus

    Nachtrag: Verdammt, zu langsam und die zweite Seite nicht gesehen ...
    Tiny ASURO Library: Thread und sf.net Seite

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.669
    ... schlecht ... vom GCC auch nicht ... zu langsam ... zweite Seite nicht gesehen ...
    Die Meldungen und eben auch die Warnungen nehme ich seit den ersten paar C-Monaten schon ernst. Ach - und zu langsam bist Du nicht. Lieber langsam und deutlich als eine schnelle, nichtssagende Bemerkung. Und ich finde es prima, dass ich mit Deiner/eurer Hilfe in diese eher tieferen Details reinkomme.

    Danke für alle klaren Hinweise und Erklärungen, ich hab wieder etwas dazu gelernt (und arbeite an dem Thema noch ein bisschen weiter). Schönen Sonntag allen, ich habe Neuschnee, s..kalt, Tourenschi stehen an der Türe - gleich gehts rauf in die Berge...
    Geändert von oberallgeier (13.01.2013 um 08:37 Uhr)
    Ciao sagt der JoeamBerg

  5. #15
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Dumm, eigentlich hätte ich das Vorzeichen benötigt.

    Der Compiler hat (fast) immer Recht.
    In deinem Fall sollte das auch mit dieser Funktion klappen. In dieser Funktion wird dann dein int16_t so behandelt als ob es ein uint16_t sei. ABER: Es wird ja nicht gerechnet sondern nur gespeichert. Es geht, in diesem Fall, nichts verloren. Auch beim lesen, kommt dann genau die Zeichenfolge wieder raus.

    Diese Warnung ist dann wichtig, wenn du damit rechnest. Hier wäre bsp. -7 als uint16_t 32768+7 (Zweierkomplement). Aber die Bitfolge ist exakt dieselbe. Das 2^15 Bit ist das Vorzeichenbit. Bei uint16_t ist das ein einfacher Summand in der Zahl wie jede andere Zahl auch. Bei int16_t ist das 2^15 Bit das Vorzeichen.

    Warum machen die Prozessoren das so? Weil mit dem Zweierkomplement eine Subtraktion fast wie eine Addition ausgeführt werden kann

    Gruß
    Georg

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress