www.mikrocontroller.net

Forum: Compiler & IDEs Wie herausfinden ob an der EEPROM ein String ist?


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte gerne wissen ob ein bestimmter Bereich im EEPROM einen String 
enthält. Dazu habe ich mir eine Unterfunktion geschrieben die auch auf 
den ersten Blick funktioniert aber der Compiler meckert mich nun mit:

"test.c:2841: warning: pointer targets in passing argument 1 of 
'chk_eep_str' differ in signedness

an.

Da ich nun gelernt habe der Compiler hat immer recht oder mit anderen 
Worten, nimm auch die Warnungen ernst, würde mich interessieren was
ich übersehen habe / wie man es richtig macht.

Die Funktion ist diese:
uint8_t chk_eep_str(const uint8_t *eepstr)
{
  char chr;
  chr = eeprom_read_byte(eepstr);
    if ((chr != 0) && (chr != 255)) return 1;
  else return 0;
}

...der Aufruf erfolgt mit...
if ( chk_eep_str(eep_buf[p+i].name) ) {
  lcd_eep_string(eep_buf[p+i].name);
}
else
{
  lcd_string("leer");
}


Danke falls sich das einer ansieht... ;-)

Gruß AVRli...

Autor: Ohm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Gewähr: Laut Funktionsdefinition zeigt der Pointer auf einen 
unsigned, der übergebene Wert ist aber signed.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist .name definiert ?

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Zabe schrieb:
> Wie ist .name definiert ?

Als char wie ich gerade sehen... :-(

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR-GCC ist ziemlich pingelig.

Stringpointer akzeptiert er nur als (char*) oder (void*).
Alles andere meckert er an, auch (int8_t*).

Am besten alles nach (void*) casten, dann gibt er Ruh.


Peter

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist erstmal Ruhe...
uint8_t chk_eep_str(const char *eepstr)
{
  char chr;
  chr = eeprom_read_byte(eepstr);
    if ((chr != 0) && (chr != 255)) return 1;
  else return 0;
}

Peter Dannegger schrieb:
> Am besten alles nach (void*) casten, dann gibt er Ruh.

Also ich tu mich echt schwer mit den Zeigern und dem "casten" ich hab 
einfach noch nicht kapiert was man damit genau macht.


Danke an alle!!!
Gruß AVRli...

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Der AVR-GCC ist ziemlich pingelig.

Zu Recht.

> Stringpointer akzeptiert er nur als (char*) oder (void*).

Alle anderen Typen wären auch falsch.

> Alles andere meckert er an, auch (int8_t*).
>
> Am besten alles nach (void*) casten, dann gibt er Ruh.

Oder halt gleich den richtigen Typ verwenden. Es ist schon Absicht, daß 
es in C typisierte Zeiger gibt.

AVRli schrieb:
> Peter Dannegger schrieb:
>> Am besten alles nach (void*) casten, dann gibt er Ruh.
>
> Also ich tu mich echt schwer mit den Zeigern und dem "casten" ich hab
> einfach noch nicht kapiert was man damit genau macht.

Dann solltest du es auch nicht leichtfertig einsetzen, denn damit kann 
man ziemlichen Mist produzieren, wenn man es falsch einsetzt. Du wirst 
allerdings nicht drum herum kommen, dir das mal genauer anzusehen.

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Dann solltest du es auch nicht leichtfertig einsetzen, denn damit kann
> man ziemlichen Mist produzieren, wenn man es falsch einsetzt. Du wirst
> allerdings nicht drum herum kommen, dir das mal genauer anzusehen.

Gut was ein Zeiger ist, ist mir klar. Warum man den nimmt ist auch klar.
Nur wann castet man nun??? Was ist das "casten"? fragendgucken

Gruß AVRli

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

Bewertung
0 lesenswert
nicht lesenswert
AVRli schrieb:

> Nur wann castet man nun???

Wenn absolut gar nicht anders geht.
Casts sind Waffen und dementsprechend spärlich und überlegt sollte man 
sie auch einsetzen.

> Was ist das "casten"?

Wenn man dem Compiler ein X für ein U vormachen will (hier in diesem 
speziellen Fall des Umcastens eines Pointers).
An dieser Stelle bedeutet der Cast:
"Lieber Compiler. Wir tun jetzt einfach mal so, als ob dort im Speicher 
das und das liegen würde. Ja, ich weiß, das es das nicht tut, aber tun 
wir halt einfach mal so. Also halt die Klappe und mach es einfach!"
Aber, wie es halt manschmal so ist, ein Esel wird nicht deswegen zum 
Pferd, weil man ihn Pferd nennt.



Du solltest dir das wilde Mischen von
  uint8_t
  int8_t
  char

abgewöhnen. Auch wenn alle 3 Datentypen letztendlich in einem Byte im 
Speicher münden, so sind sie doch verschiedene Dinge. Die einen sind mit 
Vorzeichen, die anderen ohne. Ob ein char ein Vorzeichen hat oder nicht, 
entscheidet eine Einstellung im Compiler. Es ist daher vernünftig, 
diesen Datentyp auch extra zu sehen


   char        für alles was Stringverarbeitung bedeutet. Also
               überall wo es um Texte geht

   int8_t      ein kleiner Integer mit Vorzeichen (also zum rechnen!)

   uint8_t     ein kleiner Integer ohne Vorzeichen
               auch zum rechnen, aber diesmal ohne Vorzeichen.
               Vulgo: Ein Byte

verwende die Datentypen in diesem Sinne und du wirst weniger Ärger 
haben.

Deine Funktion chk_eep_str behauptet von sich, dass sie überprüft ob im 
Speicher ein String liegt. Ergo - Textverarbeitung. Also ist der 
angemessene Datentyp dafür ein

  uint8_t chk_eep_str(const char *eepstr)
  {
     ...
  }

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank für die ausführlich Erklärung und ja ich bin überzeugt, ich 
werde mir das "wilde Mischen" abgewöhnen!!! :-D

Gruß AVRli...

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.