Arduino och definitionen av int

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
JanErik
Inlägg: 3118
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Arduino och definitionen av int

Inlägg av JanErik »

Kompilerade om ett gammalt projekt här om dagen, och det fungerade inte längre av nån anledning.

Har en funktion som går igenom flashen och räknar en checksumma för att se om firmware ändrat.

Dvs
for (int i = 0; i < FLASH_SIZE; i++) {
...
}

Nu visade det sig att det var i den loopen det hängde upp sig, på en Mega1280 så FLASH_SIZE är 128000.
Printade ut i och den rullade över till -32xxx. Efter att ha ändrat till uint32_t fungerade det.

Vad har fått definitionen av int att ändras? Har uppdaterat Arduino-miljön (1.6.9) i nåt skede men har inte kvar den gamla. Det ska väl inte vara beroende av några andra bibliotek i systemet (glibc etc)?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45298
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Arduino och definitionen av int

Inlägg av TomasL »

Problemet med talområden för typerna i C mfl är ju att de är helt plattformsberoende, det är enbart char som är definierad till en viss längd (egentligen inte den heller).
Oavsett vilket så är det fel att använda int som du gjort, det borde varit unsigned int från början, sedan huruvida int är 16 eller 32 bitar, tja som sagt det beror på plattform/kompilator.
Troligen är int'en inte omdefinierad utan troligen någon form av bugg kanske.
Du får titta i limits.h som definierar typerna, om du har någon gammal kvar
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino och definitionen av int

Inlägg av Mr Andersson »

Har du haft samma arduinomodell hela tiden?
https://www.arduino.cc/en/Reference/Int
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).
On the Arduino Due and SAMD based boards (like MKR1000 and Zero), an int stores a 32-bit (4-byte) value. This yields a range of -2,147,483,648 to 2,147,483,647 (minimum value of -2^31 and a maximum value of (2^31) - 1).
Användarvisningsbild
maDa
Inlägg: 4076
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Re: Arduino och definitionen av int

Inlägg av maDa »

int har alltid varit -32,768 till 32,767, åtminstone på AVR/Arduino så länge jag kan minnas.
JanErik
Inlägg: 3118
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino och definitionen av int

Inlägg av JanErik »

Ja, samma kod har absolut fungerat förr.
bearing
Inlägg: 11259
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Arduino och definitionen av int

Inlägg av bearing »

Int har alltid varit int16_t i avr-gcc

Då är ju frågan om arduino studio tidigare har haft någon pre-processing som ökat din int till rätt storlek?
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino och definitionen av int

Inlägg av Icecap »

JanErik: i C är en "char" (och dess derivater) den minsta enhet som processorn kan hämta.

En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte medan det på en 16-bitars blir ett word.

Sedan är (räknat i antal bits): char <= short <= long.
De 3 olika typer kan alltså rent faktisk vara på vardera 1 byte!

Detta är orsaken till att C99 och nyare har specifika storlekar i deras bibliotek och det är samtidig orsaken till att man aldrig får använda int till variabler som kan bli större än 255.
Användarvisningsbild
Jan Almqvist
Inlägg: 1581
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Arduino och definitionen av int

Inlägg av Jan Almqvist »

Kanske är det FLASH_SIZE och inte int som har ändrats?
bearing
Inlägg: 11259
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Arduino och definitionen av int

Inlägg av bearing »

JanErik skrev:Ja, samma kod har absolut fungerat förr.
Du svarade inte på Anderssons fråga om koden tidigare körts på 128k eller en storlek som ryms i en int16?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino och definitionen av int

Inlägg av lillahuset »

Nja, det händer att en int i en åttabittare är 8 bit men det vanliga är 16 bit.
JanErik
Inlägg: 3118
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino och definitionen av int

Inlägg av JanErik »

Jan Almqvist skrev:Kanske är det FLASH_SIZE och inte int som har ändrats?
Det började jag fundera nu, har nog ett makro som tar storleken utifrån en inbyggd define beroende på modell. Om den skulle ha get 32k tidigare av nån anledning.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino och definitionen av int

Inlägg av sodjan »

> Ja, samma kod har absolut fungerat förr.

På/till *samma* Arduino hårdvara?

> En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte...

Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino och definitionen av int

Inlägg av Icecap »

lillahuset: javisst - "det händer". Standarden (<C11) medger inte att man kan spika att den är en viss storlek.

Själv har jag testat storlekar på bytes osv. i en del µC-miljöer och jag har blivit överraskat en del gångar och ska jag säkra en given storlek på en variabel är "int" den sista definition jag använder.

Storleken på en byte i ett givet miljö kan man testa vid att ge en byte-variabel värdet -1. Sedan kan en shiftrutin räkna antal '1'-bits.

short, long och de variabler kan sedan refereras till detta värde då deras storlek medelst sizeof() räknas i bytes.

Man kan alltså definiera variabler till korrekt storlek med en del #if-statements och göra det plattformsoberoende.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino och definitionen av int

Inlägg av sodjan »

I min (lilla) värld är en "byte" alltid 8 bitar.
Ett ord ("word") däremit varierar med arkitekturen.

Det kanske var "int" som du menade?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Arduino och definitionen av int

Inlägg av lillahuset »

Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.
Jag har varit med om det EN gång, en C-kompilator för PIC från CCS. Ett fruktansvärt dåligt skämt till kompilator.
Skriv svar