Aller au contenu


Photo
- - - - -

Erreur de compilation de mon code


  • Veuillez vous connecter pour répondre
10 réponses à ce sujet

#1 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 12:43

Voila, j'ai " fini " le code de mon robot et aprés compilation le logiciel me donne ces erreurs :
code_robot_sa_mere.ino: In function 'void loop()':
code_robot_sa_mere:68: error: 'else' without a previous 'if'
code_robot_sa_mere:72: error: 'else' without a previous 'if'
code_robot_sa_mere.ino: In function 'void clockwiseD()':
code_robot_sa_mere:101: error: a function-definition is not allowed here before '{' token
code_robot_sa_mere:133: error: expected `}' at end of input

Voila le code( sachant que le robot se mouvoit grâce a 2 moteurs pas a pas et se repère grâce a 2 capteurs US placé a 45° a l'avant):
#define trigPinD 2
#define echoPinD 3
#define trigPinG 4
#define echoPinG 5

//declare variables for the motor pins
int motorPin1D = 6;    // Blue   - 28BYJ48 pin 1
int motorPin2D= 7;    // Pink   - 28BYJ48 pin 2
int motorPin3D = 8;    // Yellow - 28BYJ48 pin 3
int motorPin4D = 9;    // Orange - 28BYJ48 pin 4
int motorPin1G = 10;    // Blue   - 28BYJ48 pin 1
int motorPin2G= 11;    // Pink   - 28BYJ48 pin 2
int motorPin3G = 12;    // Yellow - 28BYJ48 pin 3
int motorPin4G = 13;    // Orange - 28BYJ48 pin 4
                                            // Red    - 28BYJ48 pin 5 (VCC)
                        

int motorSpeed = 1200;  //variable to set stepper speed
int lookupD[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookupG[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
//////////////////////////////////////////////////////////////////////////////
void setup() {
  //declare the motor pins as outputs
  pinMode(trigPinD, OUTPUT);
  pinMode(echoPinD, INPUT);
  pinMode(trigPinG, OUTPUT);
  pinMode(echoPinG, INPUT);
  pinMode(motorPin1D, OUTPUT);
  pinMode(motorPin2D, OUTPUT);
  pinMode(motorPin3D, OUTPUT);
  pinMode(motorPin4D, OUTPUT);
  pinMode(motorPin1G, OUTPUT);
  pinMode(motorPin2G, OUTPUT);
  pinMode(motorPin3G, OUTPUT);
  pinMode(motorPin4G, OUTPUT);
  Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////////////
void loop(){
 int durationD, distanceD;
  digitalWrite(trigPinD, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPinD, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPinD, LOW);
  durationD = pulseIn(echoPinD, HIGH);
  distanceD = (durationD/2) / 29.1;
   Serial.print(distanceD);
   Serial.println(" cm");
   
    int durationG, distanceG;
  digitalWrite(trigPinG, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPinG, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPinG, LOW);
  durationG = pulseIn(echoPinG, HIGH);
  distanceG = (durationD/2) / 29.1;
   Serial.print(distanceG);
   Serial.println(" cm");
   
   
   if (distanceG < 10 )
   clockwiseG();
   anticlockwiseD();
   
   else if ( distanceD < 10 )
   anticlockwiseG();
   clockwiseD();
   
   else ;
   clockwiseD();
   clockwiseG();
   
   
}

//////////////////////////////////////////////////////////////////////////////
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
void anticlockwiseD()
{
  for(int iD = 0; iD < 8; iD++)
  {
    setOutputD(iD);
    delayMicroseconds(motorSpeed);
  }
  
}

void clockwiseD()
{
  for(int iD = 7; iD >= 0; iD--)
  {
    setOutputD(iD);
    delayMicroseconds(motorSpeed);
  }
  
  void anticlockwiseG()
{
  for(int iG = 0; iG < 8; iG++)
  {
    setOutputG(iG);
    delayMicroseconds(motorSpeed);
  }
}

void clockwiseG()
{
  for(int iG = 7; iG >= 0; iG--)
  {
    setOutputG(iG);
    delayMicroseconds(motorSpeed);
  }
  
}

void setOutputD(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

 void setOutputG(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}



#2 geek maxou

geek maxou

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 663 messages
  • Gender:Male
  • Location:Pas-de-Calais 62

Posté 05 mars 2013 - 07:40

Le compilateur te surligne pas en jaune ce qui ne va pas normalement ?

A.R.M.I

Autonomous Robotics Mechanics Intelligent


#3 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 10:05

Si, dans un premier temps, le compilateur me surline else if ( distanceD < 10 ) en me disant error: 'else' without a previous 'if' alors qu'il y a un if juste avant.

Une idée ? :)

#4 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 05 mars 2013 - 10:08

Comme d'habitude, toute l'information pour comprendre l'erreur est contenue dans le texte d'erreur (et pas la peine de t"énerver sur ton code :D/>/>/>/>/>/>/>/>) :
code_robot_sa_mere.ino: In function 'void loop()':
code_robot_sa_mere:68: error: 'else' without a previous 'if'
code_robot_sa_mere:72: error: 'else' without a previous 'if'
Il manque un IF avant le ELSE de la ligne 68 et avant celui de la ligne 72. Car rappelons-le, une structure condition est de la forme suivante :
if ( condition vraie )
{
   Action(s) à accomplir.
}
else
{
  Action(s) à accomplir.
}
Le ELSE est optionnel si aucune action n'est voulue dans le cas ou la condition est fausse. Il est donc possible de réduire le code précédent en :

if ( condition vraie )
{
   Action(s) à accomplir.
}

Quand on débute en C/C++ et dans un langage de programmation en général, il faut être très strict sur le respect de la syntaxe. C'est le premier cap à dépasser. Une structure conditionnelle, c'est un des deux blocs précédents, ET RIEN D'AUTRE (attention, je ne dis pas qu'autre chose ne marche pas ; Je dis juste qu'il vaut mieux en rester à ces structures qui font bien que qu'on attend d'elles).

Maintenant, la question qui tue. Que fait pour toi le code suivant ?
int a = 5;
int b = 2;

void setup(){}

void loop()
{
	int i,j;
	for(j = 0 ; j < 20 ; j++)
	{
	  if( a > b )
	  {
		 for(i = 0 ; i < 6 ; i++)
	           a -= 1;
	  }
	  else
	  {
		if( b < 10 )
		  b++;
		  a = b+3;
	  }
}

R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#5 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 11:40

Il manque un IF avant le ELSE de la ligne 68 et avant celui de la ligne 72. Car rappelons-le, une structure condition est de la forme suivante :


Mais ce que je comprend pas c'est qu'il y a un IF ligne 64. Il n'est peut être pas bien "syntaxé" ^^

Maintenant, la question qui tue. Que fait pour toi le code suivant ?


Pour moi, si on traduit ce code cela donne:

Pour J est inférieure a 20, on incrémente J

On a: - Si A supérieure a B
- Pour I égal 0, I inférieur a 6, on incrémente I
- On a A (signe inconnue) a 0

Sinon: - B inférieur a 0
- On incrémente B
- A égal B+3
Mais j'avoue que je ne comprend pas a quoi il sert ni comment il fonctionne notamment les fonction FOR dans une fonction IF.

Merci encore

#6 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 05 mars 2013 - 01:23

Mais ce que je comprend pas c'est qu'il y a un IF ligne 64. Il n'est peut être pas bien "syntaxé" ^^

Exactement. La syntaxe que tu utilises ne permet pas de faire ce que tu veux. Si tu appliques exactement la structure que je t'ai donné, cette erreur devrait se résoudre.

Maintenant, progressons vers l'explication :

Pour J est inférieure a 20, on incrémente J

Bon, ça c'est une erreur de ma part, un reste du code C qui m'a permis de vérifier le bout de code sans Arduino. Je mets à jour mon post précédent sans.

On a: - Si A supérieure a B
- Pour I égal 0, I inférieur a 6, on incrémente I
- On a A (signe inconnue) a 0

L'instruction "a -= 1;" revient à faire "a = a-1;". Cette opération revient à décrémenter a.

Sinon: - B inférieur a 0
- On incrémente B
- A égal B+3
Mais j'avoue que je ne comprend pas a quoi il sert ni comment il fonctionne notamment les fonction FOR dans une fonction IF.

Ce bout de code ne fait rien de particulièrement intéressant ou utile. Il ne sert à rien. À part à essayer de te faire sentir le problème de ton propre code.
Ca n'est pas "B inférieur à 0" mais SI B est inférieur à 0 (10 en fait). J'ouvre une nouvelle structure conditionnelle. Et je pense que tu es passé à côté de ce que je voulais te montrer.
if(b<10)
{
   b++;
   a = b+3;
}

est différent de :

if(b<10)
  b++;
  a = b+3;

Est-ce que tu comprends pourquoi ? Si ça n'est pas le cas, je te conseille de tester les deux et d'afficher les valeurs de a et b.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 03:34

Donc, d'aprés ce que je comprend, dans mon code il manque des accolades pour bien inclure dans la fonction IF les clockswises et compagnies.

Voila donc le morceau de code modifié:
if (distanceG < 10 ){
   clockwiseG();
   anticlockwiseD();
   }
   else if ( distanceD < 10 ){
   anticlockwiseG();
   clockwiseD();
   }
   else {
   clockwiseD();
   clockwiseG();
   }

Il ne reste donc comme erreur:
sketch_mar05a.ino: In function 'void clockwiseD()':
sketch_mar05a:101: error: a function-definition is not allowed here before '{' token
sketch_mar05a:133: error: expected `}' at end of input



Merci encore:)

#8 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 05 mars 2013 - 04:25

Pour repérer facilement les parenthèses et accolades oubliées, tu peux ouvrir ton fichier dans l'éditeur Notepad++ (gratuit).
Tu choisis dans le menu Langage/c++ et la coloration syntaxique permet de voir la structure du programme en couleurs.

Les lignes sont numérotées pour s'y retrouver, et des (-) dans la marge permettent de replier les parties entre { } ou ( ).

Fichier(s) joint(s)


Christian

#9 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 04:37

Merci pour l'astuce, c'est effectivement beaucoup plus pratique. A quand une version intégrée dans le logiciel ? :D

#10 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 05 mars 2013 - 05:08

Donc, d'aprés ce que je comprend, dans mon code il manque des accolades pour bien inclure dans la fonction IF les clockswises et compagnies.

Les structures if ... else et les boucles nécessitent en effet des accolades : elles permettent de visualiser la portée des variables et la structure du code. Ainsi, les fonctions appelées entre les accolades d'un if ne le seront que si la condition est vérifiée. Le SEUL cas qui autorise à ne pas mettre les accolades, c'est quand la structure conditionnelle n'est suivi que d'une SEULE instruction. Dans ce cas, seule l'instruction sur la ligne suivante sera conditionnelle, la ligne d'après est exécutée normalement. Fais donc attention à tes "else if". Ils n'ont peut-être pas le comportement que tu veux.

Il ne reste donc comme erreur:

sketch_mar05a.ino: In function 'void clockwiseD()':
sketch_mar05a:101: error: a function-definition is not allowed here before '{' token
sketch_mar05a:133: error: expected `}' at end of input

Là, c'est purement syntaxique (un oubli à mon avis). Relis bien ton code !
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#11 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris

Posté 05 mars 2013 - 05:32

BOOYA ! J'ai trouvé et reparé les petites erreurs de syntaxes et sa marche ! ( enfin... sur le robot je sais pas encore ^^ )

En tout cas, merci beaucoup :)




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users