underlig varning i c18

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

underlig varning i c18

Inlägg 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?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: underlig varning i c18

Inlägg av speakman »

Varför castar du ö.h.t. i definen?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: underlig varning i c18

Inlägg 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 :-)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: underlig varning i c18

Inlägg 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. :)
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: underlig varning i c18

Inlägg av dangraf »

Jo, jag vet att kompilatorn gör "som den tycker är lämligast" :wink: 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 :shock:
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: underlig varning i c18

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: underlig varning i c18

Inlägg 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.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: underlig varning i c18

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: underlig varning i c18

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: underlig varning i c18

Inlägg av TomasL »

Oops det blev lite fel av mig, så här är det jag gör:

Kod: Markera allt

for( ubIdx = 0; ubIdx < 5u; ubIdx++ )
Notera "5u" istället för "5".
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: underlig varning i c18

Inlägg 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"...
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: underlig varning i c18

Inlägg av Icecap »

Testat:
#define MS5535_TYPE_TEMPERATURE ((uint8)0)
#define MS5535_TYPE_PRESSURE ((uint8)1)
???
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: underlig varning i c18

Inlägg 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.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: underlig varning i c18

Inlägg 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;
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: underlig varning i c18

Inlägg av Icecap »

Kod: Markera allt

#define C_SIZE 10
uint16 size = C_SIZE;
do
  {
  // göra nått
  size -= 8;
  } while(size <= C_SIZE)
Skriv svar