www.mikrocontroller.net

Forum: Compiler & IDEs char nicht kleiner null ?


Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab hier folgende Routine um Zahlen auf einem LCD auszugeben :

void val2lcd(unsigned char xpos, unsigned char ypos, char val)
{
unsigned char temp[4];

  temp[0] = ' ';
  temp[1] = ' ';
  if (val < 0) {
    temp[0] = '-';
    val = val * -1;
  }
  if (val > 99) temp[0] = '0' + val / 100 % 10;
  if (val >  9) temp[1] = '0' + val / 10 % 10;
  temp[2] = '0' + val % 10;
  temp[3] = 0;
  lcd_goto(xpos,ypos);
  lcd_write_string(temp);
}

In der Zeile "if (val < 0) {" meckert WinAVR aber und sagt :

"messages.c:12: warning: comparison is always false due to limited
range of data type"

Kann ein char beim AVR nicht negativ sein ? Auf einem 8051er laeuft die
gleice Routine ohne Probleme.

verwirrte Grüsse
Eddi

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht muss man ein "signed" davor schreiben?!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

IIRC ist im C Standard nicht vorgegeben ob ein char signed oder
unsigned ist. Das bleibt der Implementierung überlassen. Beim GCC ist
es AFAIK so das ein char unsigned ist.

Macht auch Sinn da sich mit unsigned einfacher rechnen läßt.

Matthias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich ist das default `char' beim AVR-GCC signed, aber man kann
das auch von der Kommanodzeile überschreiben.

Da hier aber offenbar gar kein character (im Sinne eines auszugebenden
Zeichens) gewünscht ist, sondern eine kleine integer-Zahl, ist es m.E.
sinnvoller,

#include <inttypes.h>

und int8_t zu benutzen.

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich dem Compiler denn beibringen, dass mein char signed ist, oder
muss ich dann auf int umsteigen ?

So langsam glaube ich, ich haette bei Assembler bleiben sollen g

Eddi

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg,

jetzt klappt's auch mit der Temperatur...


Eddi

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, auf PC ist beim gcc char gleich signed char, aber auf ARM ist char
gleich unsigned char, so dass ich von PC-gcc zu ARM-gcc portieren
mußte.

Der ANSI-Standard definiert deshalb in stdint.h einige davon (aber
nicht von der Endianess) unabhängige Datentypen: uint8_t, int8_t, ....
Allerdings nützt das nix, wenn man Funktionen wie printf und strncmp
verwendet, denn die arbeiten mit dem plattformabhängigen char.

Autor: Helmut Weiß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Eddi,

laß Dich nicht entmutigen. Es sollte jemand sagen, daß man bei der
Deklaration einer Variablen entweder signed char (-128 bis +127) oder
unsigned char (0 bis 255) vor die char-Variable schreiben kann. Dann
ist es egal welche Voreinstellung der Compiler hat. Größere Werte
erfordern int oder long, die auch jeweils signed oder unsigned sein
können. Dann gibt es noch float, usw...

Eine Bitte an die anderen Kollegen: vergrault doch nicht einen
C-Anfänger. Jeder hat doch mal klein angefangen.

Viele Grüße

Helmut Weiß

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helmut, was willst Du?  Erstens ist das mit dem `signed' schon
geschrieben worden (bitte lies nach), zweitens halte ich die Variante
mit int8_t dennoch für vernünftiger, da sie eben genau sagt, was Du
haben möchtest: eine vorzeichenbehaftete Zahl mit 8 Bits.  Dafür
definiert der Standard schließlich diese Datentypen.  (Eddi hat's ja
offenbar damit auch erfolgreich gemacht -- wie kommst Du also auf
,vergraulen'?)

Autor: Helmut Weiß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagen denn Kernighan und Ritchie zu int9_t. Die haben ja schließlich
das Standardwerk "The C-Programming Language" (1978) geschrieben.
Sicher ist in C erlaubt, was gefällt. Aber ist nicht ein Standard
(char, int und Co)besser zu verstehen, wenn er dazu noch in einem
Handbuch nachzulesen ist, daß allgemeine Gültigkeit hat, auch heute
noch.
Und dieses Buch ist nun mal die C-Bibel!

Viele Grüße,

Helmut Weiß

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wäre endlich mal eine dritte Auflage des K&R fällig, die den
C99-Standard umfaßt.  Zur Erinnerung: die erste Auflage hat den
sogenannten "K&R-Standard" beschrieben, also den de-facto Standard
bis
zur wirklichen Standardisierung.  Die zweite Auflage hat der dann
stattgefundenen Standardisierung als ANSI-C 1989 Rechnung getragen
(alias ISO-C90).  Mittlerweile ist ISO-C99 aber das Aktuelle, K&R hin,
K&R her.

C99 ist Standard.  int8_t gehört zu C99.  Allemal besser als all die
selbgezimmerten u08 usw. Datentypen.

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jungs !!!!

Locker bleiben... Am Ende zaehlt doch mehr das Ergebnis, zumindest im
Hobbybereich. Ich hab jetzt 3 Varianten probiert (int8_t, signed char
und Compilerflag) und hab mich fuer letztere entschieden, da ich schon
exsessiven Gebrauch von "unsigned char" in meinen Sourcen gemacht
habe. Ausserdem laesst es sich so besser zwischen AVR und 8051
wechseln.

Also : Ich denke, so wie jeder mag. Das sollte hier nicht in eine
Grundsatzdiskussion ausarten.

In diesem Sinne...

Eddi

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
K&R hat mit ANSI-C nur wenig zu tun; beispielsweise fehlen komplexe
Zahlen, sequence points und NaN habe ich da noch nicht gesehen.
Im K&R-Buch ist vom ANSI-C nur ca. 1/4.
Am Besten kauft man sich, nach dem Buch C-FAQs, den ANSI-Standard von
www.ansi.org; der kostet nur rund 14 EUR ;-) Das Rationale dazu ist
auch lesenswert.

Im Standard findet man interessante Sachen wie Compiler, bei denen alle
Variablen als volatile behandelt werden. Das erklärt den meist
mieserablen Microcompiler-Code, den man vielfach findet und der kein
bischen portabel ist, weil der unter anderen (ANSI-C-) Compilern nicht
funktionert.
Dass diese Compiler auf dem Stand von 1990 sind und selbst einfache
features wie den qualifier restrict nicht haben ist da noch ein kleines
Problem.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...da ich schon exsessiven Gebrauch von "unsigned char"
>in meinen Sourcen gemacht habe...

Wenn Du "unsigned char" verwendest, wird Dir kein Compilerflag helfen
können, da Du explizit angibst, daß der Wert in dieser Variablen nicht
kleiner als null (0) werden kann.

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon klar, deswegen hatte ich das ja an genau der besagten Stelle als
"char" definiert.

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.