Sida 1 av 6

C, varning datatyp

Postat: 9 april 2015, 21:14:37
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();

Re: C, varning datatyp

Postat: 9 april 2015, 21:39:50
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.

Re: C, varning datatyp

Postat: 9 april 2015, 21:45:30
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

Re: C, varning datatyp

Postat: 9 april 2015, 23:21:54
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."

Re: C, varning datatyp

Postat: 10 april 2015, 06:25:03
av persika
Nu funkar det, lösningen blev:

Kod: Markera allt

typedef signed char		sInt8;
Tack för hjälpen!

Re: C, varning datatyp

Postat: 10 april 2015, 06:36:30
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.

Re: C, varning datatyp

Postat: 10 april 2015, 21:02:56
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 ?

Re: C, varning datatyp

Postat: 10 april 2015, 21:18:55
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

Re: C, varning datatyp

Postat: 10 april 2015, 21:24:33
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.

Re: C, varning datatyp

Postat: 10 april 2015, 23:27:57
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.

Re: C, varning datatyp

Postat: 11 april 2015, 00:30:50
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

Re: C, varning datatyp

Postat: 11 april 2015, 00:53:34
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...

Re: C, varning datatyp

Postat: 11 april 2015, 07:20:02
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.

Re: C, varning datatyp

Postat: 18 september 2015, 19:27:56
av Mr M
Ett tips: Använd heltalstyperna från stdint.h så slipper du skapa egna. :tumupp:

Re: C, varning datatyp

Postat: 18 september 2015, 19:32:32
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.