C, varning datatyp

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, varning datatyp

Inlägg av lillahuset »

TomasL: Varför då?

Annars så har jag varit med om att en char är 32 bit och sizeof(char) är 1. TI C för TMS320C3x.
Mr M
Inlägg: 165
Blev medlem: 20 januari 2006, 21:35:14

Re: C, varning datatyp

Inlägg av Mr M »

I stdint.h har kompilatortillverkaren typdefinierat standardtyper så att du kan skriva portabel kod (lättare).

Kolla i den filen.

Du kommer hitta datatyperna int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t bland annat. Använd dom.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Personligen, litar jag inte på dessa.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Av den enkla anledningen
Rule 13 (advisory)
This rule states that an application should not directly use basic types such as char, int, float etc. Instead specific-length equivalents should be typedefed for the specific compiler, and these type names should be used in the code. The reason is that different compilers could use different underlying representation for the basic types. The most common case is the type int that could be seen as 16 bit wide by one compiler and 32 bit wide by another.
Detta från MISRA.
Just därför skall man typa ina egna variabler, fr att inte få några överaskningar.

Visst, det kan säkert finnas uint_8 osv, men man kan ju aldrig vara säker, speciellt inte när det gäller C
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, varning datatyp

Inlägg av lillahuset »

TomasL: Det är sådan som du smo ger C dåligt rykte.

Edit: inte smo utan som.
Edit igen: inte sådan utan sådant Läggdags tror jag,
Senast redigerad av lillahuset 18 september 2015, 21:39:09, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Nejdå, bara goda råd.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, varning datatyp

Inlägg av lillahuset »

Vad är problemet med stdint.h?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C, varning datatyp

Inlägg av TomasL »

Säkert inga problem, men som allting i C, man kan inte vara riktigt säker på nånting.
Vilket naurligtvis är det roliga med just C, allting är tillåtet, typ, och att det kan bli katastrof, när man inte har 100 koll.
superx
Inlägg: 1127
Blev medlem: 19 juni 2012, 23:28:16
Ort: Linköping

Re: C, varning datatyp

Inlägg av superx »

Finns den så har jag aldrig hört talas om att det är något problem. Men den saknades ju länge i Visual Studio, vilket var/är väldigt irriterande. Går såklart att skriva en egen för att komma runt just det problemet.

Förresten så är standarden (C99) tydlig vad det gäller just stdint.h som jag mins det.
Användarvisningsbild
Icecap
Inlägg: 26149
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C, varning datatyp

Inlägg av Icecap »

superx: C99 och nyare må vara det men C89 är inte. Och ANSI C är C89, något som används väldigt mycket.

Problemet är sällan att det blir fel när man gör en rutin och återanvänder den inom samma µC-familj (t.ex. 8 bit -> 8 bit), problemet är att säkerställa att man kan använda en funktion från t.ex. PIC/8051/ATmega (8 bit) på t.ex. 32-bitars ARM/Renesas eller liknande.

C är i mångt och mycket ett bra språk för att det är så tillåtande. Samtidig kan man göra dundertabbar just för att det är så tillåtande och de kan vara skitsvåra att hitta.

Jag använder själv fula knep ibland, t.ex. att fixa åtkomst till en WORD-baserat buffer på BYTE-nivå, helt enkelt för att spara tid under utskanningen av ett bildminne. Den µC jag använder kan väljas att köra Little Endian eller Big Endian så väljer man fel Endian är den rutin "död" (om nu inte jag hade fixat det vid att kolla Endian och skriva två versioner).
superx
Inlägg: 1127
Blev medlem: 19 juni 2012, 23:28:16
Ort: Linköping

Re: C, varning datatyp

Inlägg av superx »

Nu var det dock ev. fel i stdint.h vi diskuterade, så C99 var väl underförstått så som jag förstod det. Men visst, det kan finnas behov av egna typedefs och makron, men jag skulle inte rekommendera det som standardlösningen. Risken att man själv gör fel är ju inte obefintlig direkt, och om man kan använda något som kompilatortillverkaren tillhandahåller och som testas av många användare tror jag det är bättre.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, varning datatyp

Inlägg av lillahuset »

Det är väl liksom tanken. :D
thomasloven
Inlägg: 96
Blev medlem: 2 februari 2011, 13:16:32
Kontakt:

Re: C, varning datatyp

Inlägg av thomasloven »

TomasL skrev: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.
Hur ger du dina datatyper en bestämd längd?
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: C, varning datatyp

Inlägg av baron3d »

Du läser i manualen till din C-kompilator.
Där står längden på alla datatyper.

Står det att en short är 16bitar så skriver du: typedef signed short sint16;
och: typedef unsigned short uint16;

En long brukar vara 32bitar:
typedef signed long sint32;
typedef unsigned long uint32;
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: C, varning datatyp

Inlägg av lillahuset »

Helst bör man använda stdint.h.

Mitt minne av vad en char är är "den minsta adresserbara enheten" men det kan vara fel. Minnet är inte vad det varit. Möjligen skiljer det mellan K&R och ANSI.
Skriv svar