Blandade C++ frågor, nybörjarnivå

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

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:

Kod: Markera allt

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?
rolex42
Inlägg: 519
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av rolex42 »

Jag har inte programmerat i Atmel Studio nån gång, men hur ser koden ut? Du gör en "comparision" med nåt antar jag?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

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.

Kod: Markera allt

#include "LEDdisplayMain.h"

void setup() {
	
	Serial.begin(9600);           // set up Serial library at 9600 bps
	Serial.println("cardTemp");

	pinMode(A7, INPUT);
	pinMode(13, INPUT);

	}

int showData = 0;


	void loop() {
	
	int showData = 0;
	int buttonState;
	int lastButtonState = LOW;

	long lastDebounceTime = 0;
	long debounceDelay = 50;
		
		while(1) {
		
		int reading = digitalRead(13);
		
		if (reading != lastButtonState) {
				lastDebounceTime = millis();
		}

		if ((millis() - lastDebounceTime) > debounceDelay) {

			if (reading != buttonState) {
				buttonState = reading;

				if (buttonState == HIGH) {
					showData++;
				}
			}
		}
		lastButtonState = reading;
		}
	}
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av LHelge »

Det går lite religion i det hela, så jag kommer garanterat få mothugg men...

Jag är en stark förespråkare av att använda integer definitionerna i stdint.h så du vet EXAKT vad du skapar för variabler. de ser ut såhär

Kod: Markera allt

uint8_t
int8_t
uint16_t
int16_t
uint32_t
int32_t
...
Du vet exakt hur många bitar lång din variabel är, och du vet om den är signed eller unsigned.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

Det ska du inte få mothugg mot. Hade redan lyckats glömma av det här men minns att jag bestämt mig för att köra det här spåret.

Jag ska inkludera stdio.h stdint.h och ändra alla typer. Får se om varningen är kvar efteråt. Återkommer!

EDIT: Skrev fel ovan.
Senast redigerad av Magnus_K 8 februari 2016, 22:27:14, redigerad totalt 1 gång.
rolex42
Inlägg: 519
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av rolex42 »

Hmm. Jag testade koden i Arduino och det blir ju inte samma warning verkar det.
Jag kan inte hitta nåt ställe man jämför signed med unsigned.
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Icecap »

Magnus_K: du deklarerar två olika variabler med samma namn i rad 13 & 18. Det är väl ganska normalt att man bara deklarerar den ena.
rolex42
Inlägg: 519
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av rolex42 »

Jag förutsatte att bara den ena skulle vara aktiv ... ???
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

Tack för att du testade själv rolex42.

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.
rolex42
Inlägg: 519
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av rolex42 »

Utmärkt.

Själv experimenterar jag med hårdvaru-debounce av Rotary switch
debounce.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

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:

Variabler: showTemp
Funktioner: doDebounceButton
I/O's: TEMP_PIN

Har ni förslag på förbättringar/standarder?
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Mr Andersson »

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:

Kod: Markera allt

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.

Angående signed/unsigned-varningen;

Kod: Markera allt

if ((millis() - lastDebounceTime) > debounceDelay) {
unsigned long - long ; resultatet är unsigned
unsigned long > long ; ger en varning
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

:doh:
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å! :tumupp:
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.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Lennart Aspenryd »

Standards är viktiga. Man skall ha många, sa väl någon Marx!
https://en.m.wikipedia.org/wiki/Categor ... _standards

Men grejen är ju dels egen läsbarhet, man glömmer, dels möjligheten att bolla och få hjälp av andra.
Så 3:18 I ären på rätt väg.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Blandade C++ frågor, nybörjarnivå

Inlägg av Magnus_K »

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.
Skriv svar