mikrocontroller.net

Forum: Compiler & IDEs Warnung beim kompilieren


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab zuerst WinAVR 20040720 mit avr-gcc 3.4.1 benutzt, dann auf
WinAVR 20060421 mit avr-gcc 3.4.6 aktualisiert und mein derzeitiges
Projekt soweit modifziert, dass es sich fehler- und warnungsfrei
kompilieren lässt.

Neulich habe ich dann man avr-gcc 4.1.1 eingespielt und bekomme bei der
Übersetzung meines Programms mehrere der folgenden Warnung:

"pointer targets in passing argument 2 of 'ltoa' differ in
signedness"

Der dazugehörige Programmteil sieht so aus :
#include <stdlib.h>

void DisplayFrequency(unsigned long freq)
{
   unsigned char Buffer[7] = " 00.00\0";
   
   // ...
  
   ltoa(freq, &Buffer[0], 10);

   // ...
}

Ich habe noch nachgesehen, an der Definition von ltoa scheint sich
nichts geändert zu haben. Ich hoffe es kann mir jemand helfen.

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich vermute, der compiler ist so "schlau" , das er

&Buffer[0]

gleich als

Buffer

nimmt, wie's imo auch geschrieben werden sollte: "Der Name eines
Arrays ist ein Zeiger auf das erste Element" .
Dies ist dann ein pointer auf unsigned char ist, wohingegen ltoa einen
signed char bevorzugt.

bye kosmo

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tobias:

Aus welchem Grund benutzt du unsigned char? Der Typ für Zeichen ist
char. Daher kommt auch die Warnung.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bingo, das war's!

Ich bin so an Imagecraft ICCAVR gewöhnt, denn dort ist "char"
äquivalent mit "unsigned char".

Ok danke, alles klar!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char ist zwar immer als entweder signed char oder unsigned char
implementiert (beim GCC kann man die Vorzugsimplementierung
zwischen beiden auch wechseln), man sollte es aber immer als einen
von beiden Varianten verschiedenen Typ behandeln, andernfalls ist
das Programm nicht mehr portabel.

Grundsatz: "char" für alles, was darstellbare Zeichen sind, mit
denen aber nicht gerechnet wird.  "unsigned char" bzw. "signed
char" überall dort, wo man es als kleinen Integer benutzt (oder
besser gleich int8_t oder uint8_t aus <stdint.h>, aber das ist
ein C99-Feature).

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Infos, Jörg!

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.