Det kommer bli många frågor är jag rädd för men ändrar ämnet eventuellt till något mer passande eftersom.
Sitter i Atmel Studio 7 och programmerar en Arduino Nano V3.
När jag deklarerar en variabel av typen int och utanför main-loopen så får jag en kompileringsvarning som lyder:
Warning comparison between signed and unsigned integer expressions [-Wsign-compare]
Det spelar ingen roll om jag skriver unsigned int eller signed int, samma varning. I detta fallet spelar det ingen roll om den är signed/unsigned då jag bara ska spara ett tal mellan 0-3.
Varningen försvinner först när jag placerar deklarationen i loopen. Har någon lust att förklara varför? Är det här vad som gör skillnaden mellan en global och lokal variabel?
Har precis börjat programmet och tänkte starta med en debounce-rutin. Det inte jag tänkte göra med den specifika variablen är att öka till 3 och sen tillbaka till 0. I nuläget påverkar bara showData++ variabeln.
Tänkte reda ut det här för att få allt rätt från början.
Ledsen det tog lite tid att svara men var tvungen att testa lite olika varianter och det gör inte speciellt fort här tyvärr.
Helt rätt att jag hade "dubbeldeklarerat". Tror inte jag hade gjort det hela tiden utan den sista versionen som jag klistrade in här såg ut så. Klantigt, ja, men det verkade inte vara det som orsakade varningen.
Inkluderade stdint.h biblioteket och ändrade alla typer enligt det biblioteket. Efter kompilation försvann varningen. Även vid dubbeldeklaration (borde man inte få varning om sånt?).
Ändrade tillbaka till dom ursprungliga typerna och tog bort dubbeldeklarationen, och varningen kom tillbaka.
Inte för att jag förstår vad som hände men nu ser det lite bättre ut i alla fall.
Häftigt. Aldrig använt en rotary encoder men antar väl dom behöver avstudsas också? Får vi se mer av projektet?
Har suttit en stund nu och jäklar vad imponerad man blir av er som sitter med det här i timmar varje dag och lyckas hålla reda på allt...
Söker tips hur jag kan få texten lite mer lättläst? Indentering (tror jag det kallas) är jag med på men det här hur variabler m.m bäst ser ut? I nuläget skriver jag så här:
Magnus_K skrev:Inkluderade stdint.h biblioteket och ändrade alla typer enligt det biblioteket. Efter kompilation försvann varningen. Även vid dubbeldeklaration (borde man inte få varning om sånt?).
Ändrade tillbaka till dom ursprungliga typerna och tog bort dubbeldeklarationen, och varningen kom tillbaka.
Inte för att jag förstår vad som hände men nu ser det lite bättre ut i alla fall.
Nej du får ingen varning eftersom variablerna med samma namn ligger i olika scope och det är lagligt att gömma variabler. Jag gissar att Atmel Studio använder gcc som kompilator och då kan du slå på varningar med '-Wshadow'.
Exempel:
int i = 0; // globalt scope
int main() {
int i = 1; // nytt scope. main() kommer att se en egen 'i'.
// ändringar i main::i sparas inte i den globala i, och ändringar i den globala variabeln ses inte av main.
{
int i; // nytt scope igen.
i = 33; // Ändringar av i ses varken av main eller i den globala variabeln.
}
{
extern int i; // "importera" globala i
i = 99; // här kommer ändringar av i att sparas i globala i.
}
// tillbaka i main's scope som har en egen 'i'.
printf("i=%d", i); // kommer att skriva ut 1
#ifdef __cplusplus
printf("i=%d", ::i); // annat sätt att komma åt det globala scopet.
#endif
}
Hade du försökt deklarera samma variabelnamn flera gånger i samma scope hade du däremot fått ett fel.
Körde originalprogrammet igen och mycket riktigt, varningen som första inlägget handlar om, pekar inte mot int showData utan just raden if ((millis() - lastDebounceTime) > debounceDelay).
Nu förstår jag; eftersom jag definerade (?) om debounceDelay till unsigned så varnar den ej då jämförelsen blir mellan unsigned och unsigned.
Väldigt snällt med förklaringen om variabler i samma/olika scope också!
Just att man kom åt en global variabel genom :: eller extern visste jag inte.
Nu kanske det blir lite överdrivet men vill ändå fråga: hur kommer man då åt en variabel i ett annat scope?
I det egna scopet så kommer man åt den direkt och vet nu hur man kommer åt den globala.
Jo jag glömmer tyvärr snabbt sånt här, som jag inte sitter med så ofta.
Det går bättre och bättre att läsa och förstå kod, men att skriva den från huvudet kan jag inte. Brukar alltid få leta upp en liknande funktion på nätet, försöka förstå vad som händer, och sen modifiera.
Efter en del läsande så förstår jag att man inte kommer åt andra lokala variabler.
Behövs den i en annan funktion så gör man den global.