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

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

> hur kommer man då åt en variabel i ett annat scope?

Det kan du inte med mindre än det andra "scopet" har
tillåtit det genom att den "global", hur nu det görs...

Däremot kan du ju alltid se variabler "uppåt", så att säga.
Det är enbart när du har en egen med samma namn som
du måste skriva lite speciellt för att komma runt det.
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 »

God kväll,
efterfrågar lite hjälp för att få nedan att fungera.

Har "överkommenterat" lite för att visa hur jag tänker.
Funktionen går ut på att kolla den inkommande USART-datan och om denna matchar ordet "Start", så ska texten skrivas ut.
Det närmsta jag kommer är att jag får ut rad efter rad av decimala motsvarigheten av S, t, a, r och t.

Kod: Markera allt

while (Serial.available()>0) {						// Stay in function while data in the buffer
			incomingData = Serial.read();					// Read buffer and add data to var
			dataContent += incomingData;					// Add data to string
			
			if (dataContent == "Start") {					// If string matches the characters Start, then
				Serial.println("Communication started!");	// Print text on screen
				dataContent = "";							// Delete string
			}
			 
		}
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Hur är dataContent definierad? Notera att C (och inte väl heller C++)
har någon specifik datatyp av typen "string". dataContent borde vara
en pekare till början av en array som kan innehålla lite av varje...
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 »

Du är nog något på spåret sodjan men jag förstår inte så mycket av det här med pekare än.

Variabeln är definerad som just string, så här -> String dataContent;
Hur mycket minne som allokeras till en string vet jag inte.

Datan som jag ska matcha är bara orden "Start" och "Stop" och då borde Start bli störst. Klurade lite i dom här banorna innan men det tog helt enkelt stopp.
Start borde bli 5 bytes, dvs 40 bitar. Tyvärr lite för stort för en uint32_t och (precis här tog det stopp i tankeverksamheten).
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

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

Inlägg av lillahuset »

Om det är strcmp() som jämför blir "Stop" störst. Mina C++ kunskaper är i princip noll så det här kanske bara var nonsens.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Ah, OK. Ja, Arduino har en inbyggd String objekttyp för att man ska
slippa att hålla på med pekare och så där. Tar lite mer minne och
sannolikt lite mer CPU, men så är det ju alltid... :-)

Av vad jag förstår från denna sida:
https://www.arduino.cc/en/Tutorial/Stri ... nOperators
så ska man bl.a. göra

dataContent = String("");

för att ge en String ett värde. I detta fall en tom sträng.
Och "delete string" är lite fel, "empty string" kanske men
objektet dataContent finns ju ändå kvar.
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 »

Hehe, ja säkert. Men jag är tacksam för allt gratis jag kan få i nuläget :wink:

lillahuset fick mig och kika närmre på det här med strcmp() och efter en massa googlande och modifierande så lyckades jag faktiskt få ihop nedan. Och som fungerar som tänkt.
Ser ni något riktigt tokigt?

Kod: Markera allt

void doCheckSerialCom() {
	
	uint8_t bytesReceived;
	char dataString [11];
	bool startCmd;
	bool stopCmd;
	
	if(Serial.available() > 0) {
		bytesReceived = Serial.readBytesUntil (13,dataString,10);
		dataString[bytesReceived] = 0;
		startCmd = strcmp (dataString, "Start");
		stopCmd = strcmp (dataString, "Stop");

		if (startCmd == 0) {
			Serial.println("Communication started!");
			} else if (stopCmd == 0) {
					Serial.println("Communication stopped!");
			} else {
			Serial.println("Either Start or Stop the serial communication");
		}
	}
}
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Ja, det är ju det klassiska sättet, utan String objektet.

Ska det inte vara :

"Neither Start or Stop the serial communication"?
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 bytte till det klassiska sättet. Lite mer hardcore, eller vad det är man brukar säga...

Nja, det var bara något jag drog till med. "Antingen Starta eller Stoppa den seriella kommunikationen". Typ att det bara fungerar med Start eller Stop. "Varken Starta eller Stoppa" låter konstigt tycker jag.
Nog om det, väldigt OT!
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

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

Inlägg av lillahuset »

Det är "helt OK" att skriva "if (startCmd == 0)" men bättre att skriva "if (0 == startCmd)". Om konstanten är till vänster om == får du ett kompileringsfel om du skriver =.

Sedan är resultatet av strcmp() en int inte en bool. http://linux.die.net/man/3/strcmp

Och sodjans invändning är riktig. :)
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 »

Ah! Där ser man. Så det kanske är anledningen varför man skriver så på en del ställen.
Själv tycker jag det känns bakvänt att skriva if(0 == startCmd) men det är klart, vänjer man sig vid det så.
Testade att kompilera if(startCmd = 0) och fick en varning, men inget fel.

Tänkte spara minne så valde bool men det kanske inte spelar någon roll i slutändan.
Hur kommer det sig förresten att kompilatorn inte skrek mig i örat när funktionen resulterar i en int men jag säger att det är en bool?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

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

Inlägg av lillahuset »

Boolen kanske är definierad som int.

Vad har du valt för nivå på varningar. Är det gcc så bör du välja minst "-Wall".
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

> "Antingen Starta eller Stoppa den seriella kommunikationen"

Men det var ju "Varken Starta eller Stoppa den seriella kommunikationen".
Det var inte "Start" och det var inte "Stopp" i strängen...
Användarvisningsbild
Jan Almqvist
Inlägg: 1652
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

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

Inlägg av Jan Almqvist »

lillahuset skrev:... men bättre att skriva "if (0 == startCmd)". Om konstanten är till vänster om == får du ett kompileringsfel om du skriver =.
Att alltid ha konstanten till vänster är ganska praktiskt om man jobbar i flera/många olika språk där jämförelse_lika_med mellan två uttryck skrivs som "==" i vissa språk och som "=" i andra.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

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

Inlägg av johano »

sodjan skrev:> "Antingen Starta eller Stoppa den seriella kommunikationen"

Men det var ju "Varken Starta eller Stoppa den seriella kommunikationen".
Det var inte "Start" och det var inte "Stopp" i strängen...
Tror texten var menad som en "hjälp" till användaren i andra änden om att de enda kommandon
den förstår är "Start" och "Stopp", men jag håller med om att den är lätt att missförstå.

/johan
Skriv svar