Ifall det nu var avsett som ett meddelande till en användare...
Blandade C++ frågor, nybörjarnivå
Re: Blandade C++ frågor, nybörjarnivå
"Fel Kommando! Använd enbart 'Start' eller 'Stop'."
Ifall det nu var avsett som ett meddelande till en användare...
Ifall det nu var avsett som ett meddelande till en användare...
- 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å
Det ska jag kolla upp!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".
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å
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...
> 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...
- Jan Almqvist
- Inlägg: 1660
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Blandade C++ frågor, nybörjarnivå
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å
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.
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.
- Jan Almqvist
- Inlägg: 1660
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Blandade C++ frågor, nybörjarnivå
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å
Jorå, minst lika enkel. loop'en upprepas så länge b() är sann.
- Jan Almqvist
- Inlägg: 1660
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Blandade C++ frågor, nybörjarnivå
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å
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.
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å
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.
Om funca() returnerar falskt, kommer inte funcb att köras eftersom det inte spelar någon roll vad den returnerar.
Vilket gör att man t.ex. kan skriva ett sånt här program som kompilerar och funkar prima i valfri *IX:
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
&& 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();
}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;
}
(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!
MVH: Mikael
Re: Blandade C++ frågor, nybörjarnivå
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.
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å
Jag tycker Linus Thorvalds sätter huvudet på spiken:
Det här var lite kul också: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.
- 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å
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.
Edit: Jo jag är lite som Linus, gillar också hårdvarunära programmering. Inga andra jämförelser.
- 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å
@lillahuset: -Wall användes redan
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)
Fann till slut vart jag kunde slå på den här funktionen och det fungerar ju kanonMr 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'.
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;
}
