Sida 3 av 10

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

Postat: 10 februari 2016, 13:13:12
av sodjan
"Fel Kommando! Använd enbart 'Start' eller 'Stop'."

Ifall det nu var avsett som ett meddelande till en användare... :-)

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

Postat: 10 februari 2016, 15:36:04
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?

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

Postat: 10 februari 2016, 16:22:20
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... :-)

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

Postat: 10 februari 2016, 17:08:13
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
    }

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

Postat: 10 februari 2016, 17:30:24
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.

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

Postat: 10 februari 2016, 17:40:21
av Jan Almqvist
men den här är inte lika självklar att dela i två...

Kod: Markera allt

    while ( a = b() )
    {
        ...
    }

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

Postat: 10 februari 2016, 17:41:51
av Icecap
Jorå, minst lika enkel. loop'en upprepas så länge b() är sann.

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

Postat: 10 februari 2016, 17:48:16
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...

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

Postat: 10 februari 2016, 18:15:46
av Icecap
Och det gör den ju.

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

Postat: 10 februari 2016, 22:00:46
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.

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

Postat: 10 februari 2016, 22:57:22
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

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

Postat: 11 februari 2016, 07:26:55
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.

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

Postat: 11 februari 2016, 08:34:14
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å:

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

Postat: 11 februari 2016, 16:34:05
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. :)

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

Postat: 11 februari 2016, 17:20:21
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;
}