Sida 1 av 2
underlig varning i c18
Postat: 8 mars 2009, 23:17:37
av dangraf
Jag får en varning i C18 som jag inte riktigt förstår:
jag har en header med bla följande kod
Kod: Markera allt
#define MS5535_TYPE_TEMPERATURE ((uint8)(0))
#define MS5535_TYPE_PRESSURE ((uint8)(1))
typedef struct __Ms5535SensorT
{
SENSOR_API_MEMBERS
uint8 type;
uint16 config;
ComApiBaseT *spiPort_p;
PwmApiBaseT *pwmPort_p;
}Ms5535SensorT;
och en c-fil med bla denna funktionen:
Kod: Markera allt
uint16 ms5535Read(void *pThis, void *result)
{
Ms5535SensorT *ptr=pThis;
uint16 *res_p = result;
if(ptr != (Ms5535SensorT*)0)
{
if( ptr->type == MS5535_TYPE_TEMPERATURE )
{
*res_p = priv_measValues.s16Temperature;
return 2;
}
else if(ptr->type == MS5535_TYPE_PRESSURE )
{
*res_p = priv_measValues.s16Pressure;
return 2;
}
else
{
//ASSERT
return 0;
}
}
}
och får följande varning av C-18
Kod: Markera allt
C:\Temp\hepp2\Programming\extChip\ms5535.c:465:Message [3002] comparison of a signed integer to an unsigned integer detected
C:\Temp\hepp2\Programming\extChip\ms5535.c:470:Message [3002] comparison of a signed integer to an unsigned integer detected
vilket motsvarar raderna:
Kod: Markera allt
if( ptr->type == MS5535_TYPE_TEMPERATURE )
else if(ptr->type == MS5535_TYPE_PRESSURE )
vad jag kan se så är både "type" och min define av samma typ (uint8). någon som har en aning om varför jag får dessa varningar?
Re: underlig varning i c18
Postat: 9 mars 2009, 01:11:50
av speakman
Varför castar du ö.h.t. i definen?
Re: underlig varning i c18
Postat: 9 mars 2009, 12:07:29
av dangraf
jag castar i definen för att få en specifik typ istället för att göra en "const uint8". kompilatorn gör nämligen lite som den vill när den jämför varibler med varandra. Det är även för att jag ska få varningar ifall jag inte hålller koll på vilka typer jag använder (uint8, sint8, uint16 mm).
Fungerar i de flesta fall, men inte i detta

Re: underlig varning i c18
Postat: 9 mars 2009, 15:45:23
av speakman
dangraf skrev:kompilatorn gör nämligen lite som den vill när den jämför varibler med varandra.
Den brukar göra vad som är lämpligast. Det är dess uppgift.

Re: underlig varning i c18
Postat: 10 mars 2009, 16:11:10
av dangraf
Jo, jag vet att kompilatorn gör "som den tycker är lämligast"

och i detta fallet så tycker jag att det kan vara bra att veta. Löste problemet med att göra en cast till:
Kod: Markera allt
if( (uint8)(ptr->type) == MS5535_TYPE_TEMPERATURE )
tycker fortfarande att det är väldigt underligt att man behvöer göra en cast på en variabel som redan har rätt typ

Re: underlig varning i c18
Postat: 10 mars 2009, 17:30:22
av SvenW
Det är nog en felaktighet i kompilatorn. Den kanske inte benar ut strukterna ordentligt när den genererar felutskrifterna.
Gcc ger överhuvudtaget inga felutskrifter vid komparation av olika datatyper. Allt utom (int) noll ger TRUE oavsett datatyp.
Re: underlig varning i c18
Postat: 10 mars 2009, 22:54:41
av TomasL
C18 ger detta fel om man jämför med o-typade konstanter.
Kasta alla otypade konstanter och felet försvinner.
Exvis
unsigned char a;
if(a>1)
ger detta felet, men
unsigned char a;
if(a>(unsigned char)1)
Och felet försvinner.
Re: underlig varning i c18
Postat: 11 mars 2009, 09:35:10
av vfr
Det tycker jag låter lite sådär. Jag argumenterar absolut inte emot dig, Tomas, att det är så. Däremot skulle jag själv inte vara speciellt förtjust i att behöva typa alla konstanter. Jag är normalt för ganska hård typning för att ha bra koll på saker, t.ex variabler, men här tycker jag ändå att gränsen passerats.
Att typa definierade konstanter gör väl inte så himla mycket då det kan göras vid definitionen. Men även om man använder fördefinierade konstanter mycket, vilket man ska, så blir det ändå tillfällen där faktiskt tydligheten kan bli bättre av att bara ange en siffra. Att då hålla på och typa siffrorna känns inte sådär himla bra. I det fallet så tror jag faktiskt att den kan försämra tydligheten då allt extra blingblong runt om i koden till sist förtar fokus från det som verkligen betyder något.
Detta sagt från en som normalt förordar hård typning.
Re: underlig varning i c18
Postat: 11 mars 2009, 10:40:34
av TomasL
Visst är det så att man inte skall behöva typa konstanter, men tyvärr har C18 den egenheten, och om man vill kompilera utan meddelanden så behöver man typa konstanterna, tyvärr.
Re: underlig varning i c18
Postat: 11 mars 2009, 10:43:29
av TomasL
Oops det blev lite fel av mig, så här är det jag gör:
Notera "5u" istället för "5".
Re: underlig varning i c18
Postat: 11 mars 2009, 10:58:42
av sodjan
Och ditt förra exempel ("if(a>(unsigned char)1)") skulla ha varit "if(a > 1u)" ?
I så fall blir det ju betydligt mindre "blingblong"...
Re: underlig varning i c18
Postat: 11 mars 2009, 11:07:41
av Icecap
Testat:
#define MS5535_TYPE_TEMPERATURE ((uint8)0)
#define MS5535_TYPE_PRESSURE ((uint8)1)
???
Re: underlig varning i c18
Postat: 11 mars 2009, 11:26:39
av TomasL
sodjan skrev:Och ditt förra exempel ("if(a>(unsigned char)1)") skulla ha varit "if(a > 1u)" ?
I så fall blir det ju betydligt mindre "blingblong"...
Exakt, blev lite förhastat.
Re: underlig varning i c18
Postat: 11 mars 2009, 13:06:34
av dangraf
Jag sitter på jobbet just nu så jag kan inte testa så mycket..
TomasL skrev:C18 ger detta fel om man jämför med o-typade konstanter.
Kasta alla otypade konstanter och felet försvinner.
Exvis
unsigned char a;
if(a>1)
ger detta felet, men
unsigned char a;
if(a>(unsigned char)1)
Och felet försvinner.
problemet är att i ditt exempel så måste jag skriva
unsigned char a;
if((unsigned char) a > (unsigned char) 1)
för att felet ska försvinna och DET är jäklitgt märklgit.
Innnan jag gick och sov igår så dök även följande fel upp:
sint16 size = 10
do{
// göra nått
} while( (size-=8) >((sint16)0 )
för att få felet att försvinna så var jag tvunven att köra en cast på size. kör med c18 v3.15. Detta ser jag som ett STORT problem eftersom det den bara kommer gå ut loopen ifall size == 0 .. finns det nån inställning för kompilatorn som jag missat som gör att jag får dessa varningar?
kan kanske tillägga hur jag definierat sint16
typedef signed int sint16;
Re: underlig varning i c18
Postat: 11 mars 2009, 13:11:14
av Icecap
Kod: Markera allt
#define C_SIZE 10
uint16 size = C_SIZE;
do
{
// göra nått
size -= 8;
} while(size <= C_SIZE)