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

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

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

Inlägg av sodjan »

"Fel Kommando! Använd enbart 'Start' eller 'Stop'."

Ifall det nu var avsett som ett meddelande till en användare... :-)
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 »

lillahuset skrev: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".
Det ska jag kolla upp!
Ska också försöka hitta vart boolen är definierad.

@sodjan:
Är du klar med det här nu?
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Ja, *jag* är klar. :-) Tydlighet mot användare är en väldigt viktig fråga.

> Själv tycker jag det känns bakvänt att skriva if(0 == startCmd)...

Håller helt med. Det är mest en "quick-fix" för att undvika en
av dumheterna i C. Det vore enklare om man helt enkelt inte
tillåter tilldelning (=) inom if-villkor. Men nu så är det ju som
det är med det... :-)
Användarvisningsbild
Jan Almqvist
Inlägg: 1651
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

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

Inlägg av Jan Almqvist »

Just denna "dumheten" kan nog användas lite var som helst...

Kod: Markera allt

    {
        a == b;           // jämförelse men resultatet används inte
        a = b;            // tilldelning
    }
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Ibland ska man spara värdet av en funktion till senare samtidig som man ska kolla den och då kan man skriva:
if((Result = SomeFunction()) > 10)
{
}

Då får Result värdet av funktionen och if-satsen uppfylls om det värde är större än 10.

Men rent läsningsmässigt är det inte enkelt om det finns många av sådana rader och jag tror inte att det är synnerligt med effektivt än att skriva det i två rader där den första tilldelar värdet till Result och sedan kollar om Result är större än 10.
Användarvisningsbild
Jan Almqvist
Inlägg: 1651
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

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

Inlägg av Jan Almqvist »

men den här är inte lika självklar att dela i två...

Kod: Markera allt

    while ( a = b() )
    {
        ...
    }
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Jorå, minst lika enkel. loop'en upprepas så länge b() är sann.
Användarvisningsbild
Jan Almqvist
Inlägg: 1651
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

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

Inlägg av Jan Almqvist »

men jag vill ju att det värde som funktionen b() returnerar ska hamna i variabeln a också varje gång som villkoret testas...
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Och det gör den ju.
ie
EF Sponsor
Inlägg: 1371
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

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

Inlägg av ie »

I C (C++) kan man se en tilldelning som en funktion som returnerar det tilldelade värdet.

Dvs A = 5 returnerar värdet 5.

Därför funkar det att skriva A = B = C = 5, varvid samtliga variabler tilldelas värdet 5.

Därför funkar det även att skriva if ( a = b()), där a tilldelas värdet av b() och att värdet sen testas av if-satsen.
Användarvisningsbild
adent
Inlägg: 4244
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

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

Inlägg av adent »

Kom och tänka på en annan rolig sak i C.

&& och || är kortslutande. t.ex.:

Om funca() returnerar sant, kommer inte funcb att köras eftersom det inte spelar någon roll vad den returnerar.

Kod: Markera allt

if(funca() || funcb())
{
   dostuff();
}
Om funca() returnerar falskt, kommer inte funcb att köras eftersom det inte spelar någon roll vad den returnerar.

Kod: Markera allt

if(funca() && funcb())
{
   dostuff();
}

Vilket gör att man t.ex. kan skriva ett sånt här program som kompilerar och funkar prima i valfri *IX:

Kod: Markera allt

#include <stdio.h>

int main(int argc, char *argv[])
{
  argc>=2 && printf("%s\n", argv[1]);
  return 0;
}
Det går fort att lära sig C, men att bemästra det tar lite mer tid. Lite som schack :)

(Förklaring av programmet ovan:

När man kör ett c-program från en terminal ("dos-prompt") så skriver man binärens namn, typiskt:

# mittprogram

Man kan skicka in parametrar genom att lista dem efteråt t.ex.

# mittprogram param1 param2

Dessa strängar ("param1" och "param2") kommer man åt via arrayen argv[1] och argv[2].
argc kommer att innehålla siffran 3.
Varför tre säger ni då? Det är ju bara två parametrar och vad ligger egentligen i argv[0] ?

Jo namnet på binären! :) "mittprogram"

MVH: Mikael
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

C är ett starkt språk - på alla sätt och vis. Man kan göra bra program - men man kan även göra dunderfel som kan vara mycket svåra att hitta.

Det är därför att det finns en massa regler för hur man bör skriva program, vilka saker man ska undvika osv.
Användarvisningsbild
pbgp
Inlägg: 1450
Blev medlem: 11 november 2010, 09:09:22
Ort: Uppsala

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

Inlägg av pbgp »

Jag tycker Linus Thorvalds sätter huvudet på spiken:
Some people seem to think that C is a real programming language, but they are sadly mistaken. It really is about writing almost-portable assembly language.
Det här var lite kul också:
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 »

Eftersom jag är rätt förtjust i assembler är det inte så konstigt att jag gillar C också.

Edit: Jo jag är lite som Linus, gillar också hårdvarunära programmering. Inga andra jämförelser. :)
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 »

@lillahuset: -Wall användes redan :tumupp:
Mr Andersson skrev: 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'.
Fann till slut vart jag kunde slå på den här funktionen och det fungerar ju kanon :tumupp:

En liten följdfråga: vad är det egentligen den varnar om nu? Varningen lyder:
Warning declaration of 'showData' shadows a global declaration [-Wshadow]

showData är mycket riktigt en global variabel men den hänvisar till doButtonDebounce() nedan. Testade att skriva ShowOnDisplay showData inom parantesen men då får jag error på showData++ istället.
Kanske ska ignorera alla varningar i nuläget och rensa sånt här när programmet börjar bli klart istället?

(Försökt klippa ur bara väsentlig kod)

Kod: Markera allt

enum ShowOnDisplay {
	displayMachines,
	displayTemp,
	displayHVRail,
	displayError
};

ShowOnDisplay showData = displayMachines;

void doButtonDebounce(uint8_t showData) {
	
	uint8_t reading = digitalRead(13);
	uint8_t buttonState = LOW;
	uint8_t lastButtonState = LOW;
	uint32_t lastDebounceTime = 0;
	uint32_t debounceDelay = 50;
	
	if (reading != lastButtonState) {
		lastDebounceTime = millis();
	}

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

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

			if (buttonState == HIGH) {
				showData++;
			}
		}
	}
	lastButtonState = reading;
}
Skriv svar