C, varning datatyp

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
persika
EF Sponsor
Inlägg: 1355
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

C, varning datatyp

Inlägg av persika »

(Hitech C 9.83 Lite-mode, MPLAB 8.88)


Någon som förstår denna varning 764?
Jag tycker inte jag gjort nåt fel, vad göra för att rätta till det ?


Warning [764] P:\PROGRAM\pic\LCD-232\LCD-232c.c; 569. mismatched comparison


Jag har några egna datatyper, så här:

Kod: Markera allt

typedef unsigned char   uInt8;   // 0-255,             8 bits variabel utan tecken
typedef char            sInt8;   // -128 - +127,       8 bits variabel med tecken
typedef unsigned int    uInt16;  // 0-65535,          16 bits variabel utan tecken
typedef int             sInt16;  // -32768 - +32767,  16 bits variabel med tecken
Jag har en funktion, så här:

Kod: Markera allt

void FlyttaDisplayMarkoer( sInt8 f )
// f, antal steg markör, + till höger, - till vänster
{
	while (f<0)   //    <----  Varningen avser denna rad
	  {
	  SkrivLCDcmd(0x10);  //Flytta markör till vänster
	  f++;
	  }
}

I manualen står det så här om 764:

(764) mismatched comparison (Code Generator)
A comparison is being made between a variable or expression and a constant value
which is not in the range of possible values for that expression, e.g.:

Kod: Markera allt

unsigned char c;
if(c > 300) /* oops -- how can this be true? */
close();
idiotdea
Inlägg: 467
Blev medlem: 26 juli 2006, 16:11:34
Ort: Vasa, Finland
Kontakt:

Re: C, varning datatyp

Inlägg av idiotdea »

Utan att fundera på det desto mer så skulle jag tro att problemet ligger i att du antar att 'char' är signed ifall inget annat anges. Det behöver inte alls vara sant. Försök byta ut 'char' till 'signed char', och se om det hjälper.
Användarvisningsbild
adent
Inlägg: 4125
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: C, varning datatyp

Inlägg av adent »

Jag tror samma som föregående talare. Huruvida char är signed eller unsigned default är inte specat, utan upp till kompilatortillverkaren.
Oftast kan du slå om det med en flagga till kompilatorn.

MVH: Mikael
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43205
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: C, varning datatyp

Inlägg av sodjan »

Från Hi-Tech C manualen:

"If no signedness is specified in the type, then the type will be signed except for the char types which are always unsigned."
persika
EF Sponsor
Inlägg: 1355
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: C, varning datatyp

Inlägg av persika »

Nu funkar det, lösningen blev:

Kod: Markera allt

typedef signed char		sInt8;
Tack för hjälpen!
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45588
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Av detta lär man sig att alltid i alla lägen typa allting fullt ut, aldrig förutsätta att det är på ett specifikt sätt som standard.

Hade du nu inte haft f<0 utan f<i där i kan vara 0 så är det inte säkert att du fått ett felmeddelande, däremot ett en rätt svår bugg att hitta.
persika
EF Sponsor
Inlägg: 1355
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: C, varning datatyp

Inlägg av persika »

En annan fråga som anknyter lite till denna tråd.

Kan man lita på att datatypen char alltid är 8 bitar, i olika c-kompilatorer ?
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8594
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: C, varning datatyp

Inlägg av AndersG »

Kan man lita på att datatypen char alltid är 8 bitar, i olika c-kompilatorer ?
Assumption is the mother of all f-ups.... Nej, det kan du inte. Du måste kolla om du har kod som är beroende av antalet bitar.

http://en.wikipedia.org/wiki/C_data_types
Användarvisningsbild
Icecap
Inlägg: 26230
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C, varning datatyp

Inlägg av Icecap »

Nej! Standarden säger att (räknat i antal bytes) är char <= short <= int <= long.

Detta betyder att alla kan vara på 1, 2 eller 4 bytes! Men oftast är det så att char är 1 byte, short är 2 bytes, long är 4 bytes och int är den storlek som µC'n "enklast" jobbar med.

Men om man t.ex. använder en 32 bit µC kan du råka ut för att alla olika variabler är 32 bits!

Vill man kolla det är det bara att skriva ut värdet av sizeof(char), sizeof(short) osv. Jag gjorde det och fick en överraskning.

I C++ är det lite annat, där är detta faktisk fixat.

EDIT: Jahopp, andra på bollen.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43205
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: C, varning datatyp

Inlägg av sodjan »

Det är inte riktigt så enkelt som att sizeof() ger antalet bytes (så som de flesta känner
begreppet "byte"). Det ger antalet mätt i den aktuella arkitekturens minsta adresserbara enhet.
Notera att när C skapades så fanns det t.ex både 8 och 12 bitars maskiner. På en 12 bitars
arkitektur så skulle sizeof() ange antalet 12-bitars ord (eller "byte") för argumentet.

sizeof(char) är dock alltid = 1. Men det måste alltså inte betyda just *8* bitar!

I alla arkitekturer (och kompilatorer) som man lär hitta *idag* så kan man dock
med stor säkerhet anta att char = 8 bitar.

Man måste läsa en standard som är 40 (?) utifrån vad som gällde på den
tiden då stadarden skrevs och fundera på vad som är rellevant idag.
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: C, varning datatyp

Inlägg av LHelge »

Det finns en isostandard som jag inte kommer ihåg nummret på som anger hur C datatyper bör se ut. Vill man göra sin kod portabel kan det vara ide at typedeffa up dem.

int8_t
uint8_t
int16_t
...
uint64_t
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43205
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: C, varning datatyp

Inlägg av sodjan »

Ja, det finns ju olika sidor av myntet. Samtidigt som gamla C standards
säger att en "char" inte *måste* vara 8 bitar, så är det nog ett jäkla
jobb att finna en modern kompilator där det inte är just 8 bitar...
persika
EF Sponsor
Inlägg: 1355
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: C, varning datatyp

Inlägg av persika »

Intressant att höra, tack för era svar.

Jag hade just den tanken att ha egna datatyper (se första inlägget) för i händelse av flytt så gör man bara om typdefinitionerna och i koden vet man alltid hur stor en variabel är t.ex sInt8.
Mr M
Inlägg: 165
Blev medlem: 20 januari 2006, 21:35:14

Re: C, varning datatyp

Inlägg av Mr M »

Ett tips: Använd heltalstyperna från stdint.h så slipper du skapa egna. :tumupp:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45588
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Nä, gör inte det, eftersom det kan skapa problem.
Skapa alltid egna datatyper med den längd du vill ha.
När det gäller just char, s är den definierad enligt K&R som den minsta datatypen som kan hålla en full teckenuppsättning för systemet i fråga, dvs normalt handlar det då om ASCII, dvs 8 bitar.
Skriv svar