Sida 1 av 10

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

Postat: 8 februari 2016, 21:29:46
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?

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

Postat: 8 februari 2016, 21:33:04
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?

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

Postat: 8 februari 2016, 21:44:37
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;
		}
	}

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

Postat: 8 februari 2016, 22:05:30
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.

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

Postat: 8 februari 2016, 22:12:50
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.

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

Postat: 8 februari 2016, 22:18:15
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.

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

Postat: 8 februari 2016, 22:26:39
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.

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

Postat: 8 februari 2016, 22:46:57
av rolex42
Jag förutsatte att bara den ena skulle vara aktiv ... ???

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

Postat: 8 februari 2016, 23:00:58
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.

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

Postat: 8 februari 2016, 23:13:33
av rolex42
Utmärkt.

Själv experimenterar jag med hårdvaru-debounce av Rotary switch
debounce.png

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

Postat: 9 februari 2016, 01:15:15
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?

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

Postat: 9 februari 2016, 04:14:23
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

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

Postat: 9 februari 2016, 10:04:37
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.

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

Postat: 9 februari 2016, 11:08:43
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.

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

Postat: 9 februari 2016, 15:12:23
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.