'else' without a previous 'if'

algemene C code
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

'else' without a previous 'if'

Berichtdoor benvo » 27 Nov 2016, 19:51

Nieuw, eigenlijk in alles wat Arduino aan gaat. Vaak heb je dan 100.000 vragen maar eerste zoeken en proberen lijkt beter.
Daarom geprobeerd een eenvoudige sketch te maken die een ingevoerd getal afrond.
Daarbij krijg ik een foutmelding die ontstaat wanneer men na het If statement een ; toevoegd, dus zo if();
Maar het rare is dat ik dit niet zo deed en toch deze melding krijg: 'else' without a previous 'if'
Hieronder de sketch met de vraag wat zie ik over het hoofd?

cpp code
/* Sketch om getallen af te ronden op integers*/


int T;
float X;


void setup() {

Serial.begin(9600);

Serial.println(" Geef een niet integer getal in: "); //vraagt om gebruikers invoer
while(Serial.available()==0) //wacht op invoer
{

}
X=Serial.parseInt(); //Geeft X de waarde van de (gebruikers-)invoer
}

void loop() {


T=(int)X; //T krijgt de ingevoerde waarde voor de komma
if (X-T<0,5) //de waarde ligt onder een 0,5
{
X=(int)X; //rond af naar beneden
Serial.print( "Het afgeronde getal is ");
Serial.print (X); //Het afgeronde getal wordt afgedrukt
}
{
else
}

(X-T>=0,5) //de waarde ligt op 0,5 of daarboven
{
X=X+1; //afronding naar boven
Serial.print( "Het afgeronde getal is ");
Serial println (X); //Het afgeronde getal wordt afgedrukt
}
}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 'else' without a previous 'if'

Berichtdoor shooter » 27 Nov 2016, 21:15

de {} staan fout:
if (voorwaarde)
{acties als ja}
else
{anders dit }
en C is engels dus een halve is 0.5 met een punt en dus geen komma
de beide print opdrachten horen niet thuis in de if instructie, maar eronder want dan hoef je ze maar 1 keer te schrijven.

en denk eens aan het verschil tussen een int en een float, want je doet een vergelijking tussen een float en een int.
en zet haakjes om X-T om de goede volgorde van rekenen vast te zetten.
ach lekker spelen en proberen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 'else' without a previous 'if'

Berichtdoor Koepel » 27 Nov 2016, 21:40

@benvo, gebruik het altijd op deze manier:
Code: Alles selecteren
int T;
float X;

X = (float) T;

De compiler doet dat al vanzelf, maar je geeft daarmee nog eens duidelijk aan dat de integer 'T' wordt omgezet naar een 'float' waarde voor 'X'.

Probeer het eens opnieuw en laat de sketch nog eens zien. Gebruik de knop "Code" op dit forum om de sketch tussen code tags te zetten.

De Arduino heeft ook de standaard functies. Dit is de referentie voor de AVR chips, die zitten op Arduino Uno, Arduino Mega en zo: http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html
Er is dus ook een floor(), een ceil() en een round().

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: 'else' without a previous 'if'

Berichtdoor benvo » 28 Nov 2016, 13:14

cpp code
/* Sketch om getallen af te ronden op integers*/


int T;
float X;


void setup() {

Serial.begin(9600);

Serial.println(" Geef een niet integer getal in: "); //vraagt om gebruikers invoer
while(Serial.available()==0) //wacht op invoer
{

}
X=Serial.parseInt(); //Geeft X de waarde van de (gebruikers-)invoer
}

void loop()


T=(int)X; //T krijgt de ingevoerde waarde voor de komma
if (X-T)<0.5)) //de waarde ligt onder een 0.5
{
X=(int)X; //rond af naar beneden

}
{
else
}

(X-T)>=0.5)) //de waarde ligt op 0.5 of daarboven
{
X=X+1; //afronding naar boven
Serial.print( "Het afgeronde getal is ");
Serial println (X); //Het afgeronde getal wordt afgedrukt
}



Een paar aanpassingen maar nog niet al jullie (goede!!!) adviezen opgevolgd! Met de beste bedoelingen overigens. Ik begrijp ze nog niet goed. @Shooter/Paul Deelen, ik ken het verschil tussen een integer en een float getal. Misschien wordt na uitleg van mijn, waarschijnlijk foute, denkwijze duidelijk waar ik de mist inga. Dit n.a.v. je opmerking dat ik een vergelijking maak tussen een float en een integer. @ Koepel, ik had al gezien dat er een afronding bestaat die ook beschreven wordt in/bij een Math.h library. De reden dat ik toch zelf aan het knoeien ben is dat ik wil begrijpen hoe de (Arduino C) taal in elkaar steekt en werkt. Er zijn zat dingetjes die ik zo kan overschrijven maar het is de bedoeling dat ik een controller maak voor mijn (Aquarium) ledverlichting en daarbij dus een sketch schrijf. Dit lukt alleen als ik begrijp wat ik aan het doen ben, volgens mij. Jij schrijft dat ik dat ik X moet vergelijken met (float)T dat begrijp ik dus niet...

Misschien moet ik mijn gedachten gang even omschrijven zodat jullie kunnen afschieten!

Stel ik voer een getal in, zullen we zeggen 12,6? Wanneer ik dan schrijf onder void loop() dat T=(int)X dan denk ik dat (int)X de waarde 12 oplevert het getal vóór de komma. Dus T wordt ook 12? Bij de berekening (X-T)<0.5)) denk ik dat de invulling wordt: (12.6-12))<0.5)) dus de vergelijking is niet waar, het programma gaat via 'else' naar de volgende vergelijking die dan wel waar is en afgedrukt wordt?

Omdat het programma ook nu nog niet loopt kunnen jullie deze man vast duidelijk maken wat er mis is in z'n denkwijze. Waarvoor overigens mijn dank!

Groet,
Ben.

je kan het beste [ code2=cpp ] en [ /code2 ] (en dan zonder de spaties bij de vierkante haken.
moderator

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: 'else' without a previous 'if'

Berichtdoor benvo » 28 Nov 2016, 13:15

@Koepel, nu heb ik toch de codeknop gebruikt?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 'else' without a previous 'if'

Berichtdoor Koepel » 28 Nov 2016, 15:12

Code: Alles selecteren
Serial.println("Hello World");
Bijlagen
codetag.png
codetag.png (24.37 KiB) 7425 keer bekeken

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 'else' without a previous 'if'

Berichtdoor Koepel » 28 Nov 2016, 15:17

Ik hou er van om de code te schrijven zoals het is, en niet om de compiler te laten raden wat bedoelt wordt.
Code: Alles selecteren
(X-T)>=0.5))

Ben je daar een 'if' vergeten ?
De 'X' is een 'float' en de 'T' is een 'int'. Hoe wil je die van elkaar aftrekken ? Als je wilt dat de compiler er een floating point berekening van maakt, dan kun je dat de compiler vertellen.
Code: Alles selecteren
if( ( X - (float) T ) >= 0.5)

Op deze manier wordt 'T' eerst omgezet naar een 'float'. Daarna wordt het verschil berekend met 'X', en dat resultaat wordt vergeleken met 0.5, dus op die manier is voor iedereen duidelijk wat er gebeurd.

De Serial.parseInt() snuffelt de seriële input af naar een integer. Als je "12.6" wilt ingeven, dan heb je Serial.parseFloat() nodig.
https://www.arduino.cc/en/Serial/ParseFloat

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 'else' without a previous 'if'

Berichtdoor shooter » 28 Nov 2016, 23:22

de haakjes staan nog steeds niet goed.
en je hebt gelijk zo ler je het beste, gewoon lekker puzzelen
paul deelen
shooter@home.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: 'else' without a previous 'if'

Berichtdoor benvo » 29 Nov 2016, 16:45

cpp code
Code: Alles selecteren
/* Sketch om getallen af te ronden op integers*/


int T;
float X;


void setup() {

  Serial.begin(9600);

  Serial.println(" Geef een niet integer getal in:   "); //vraagt om gebruikers invoer
  while (Serial.available() == 0)                      //wacht op invoer
  {

  }
  X = Serial.parseFloat();                              //Geeft X de waarde van de (gebruikers-)invoer
}

void loop()
{

  T = (int)X;                                    //T krijgt de ingevoerde waarde voor de komma
  if ((X - (float)T) < 0.5)                                 //de waarde ligt onder een 0.5
  {
    X = (int)X;                                     //rond af naar beneden

  }
  {
    else
    }

  if ((X - (float)T) >= 0.5)                              //de waarde ligt op 0.5 of daarboven
  {
    X = X + 1;                                    //afronding naar boven
    Serial.print( "Het afgeronde getal is ");
    Serial println (X);                          //Het afgeronde getal wordt afgedrukt
  }

}



@Shooter; Helaas na lang puzzelen zie ik het nog niet. Welke haakjes staan niet goed? @Koepel: Het is me (n0g) niet duidelijk wat je bedoelt, is deze sketch beter?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 'else' without a previous 'if'

Berichtdoor Koepel » 29 Nov 2016, 17:36

Met 'int' en 'float' is het nu een stuk beter.

Wat bedoel je met dit:
Code: Alles selecteren
  }
  {
    else
    }


Een if-else ziet er zo uit:
Code: Alles selecteren
if ( ... )
{
  ...
}
else
{
  ...
}


Met plaatje dat ik had gemaakt met die rode en groene pijlen, die hoef je niet allebei te doen. De rode pijlen geven een wat saaiere sketch en de groene pijlen geven een fraaie sketch waarbij echter de rechterkantlijn van het forum verkeerd gaat.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten