Ardu? No!Initiation ≫ Erreur

Erreur

Je ne peux évidemment pas prévoir où vous allez faire des erreurs, mais je peux prévoir que vous allez en faire, et de nombreuses! Le but est ici d'en voir une et comprendre ce qui est affiché et comment corriger le code.

Première erreur

Reprenez le programme précédent:

void setup(void) {
  Serial.begin(115200);
  Serial.println("Bonjour");
}

void loop() {
}

et supprimez le point-virgule à la fin de Serial.begin(115200);. Cela doit provoquer une erreur. Testez! L'insulte en rouge indique expected ';' before 'Serial' (il manque un ; avant Serial). Mais c'est la ligne suivante qui est en surbrillance. Le compilateur indique donc l'erreur à la ligne d'après! C'est classique et déroutant. En fait vous auriez pu mettre le ; juste avant le Serial. Du coup l'erreur est bien quand il voit la lettre S. Mais pour nous, c'est à la ligne du dessus.

A droite dans la barre rouge, il y a un bouton recopier les messages d'erreur. Retenez bien ce bouton, quand on a une erreur que l'on ne comprend pas, je vous conseille de copier ces messages en cliquant sur ce bouton, et de coller ces messages dans le mail d'aide. Ainsi celui qui accepte de passer du temps pour vous aider a tous les renseignements dont il a besoin.

Voici le message que l'on a en supprimant le premier point-virgule:

C:\Cours\Cours.ino: In function 'void setup()':
C:\Cours\Cours.ino:3:3: error: expected ';' before 'Serial'
   Serial.println("Bonjour");
   ^~~~~~

exit status 1

Compilation error: expected ';' before 'Serial'

La ligne

C:\Cours\Cours.ino: In function 'void setup()':

nous indique quel fichier contient l'erreur. Ce sera important quand nous en aurons plusieurs.

La ligne

C:\Cours\Cours.ino:3:3: error: expected ';' before 'Serial'

nous indique que l'erreur se trouve à la ligne 3, colonne 3 et le type d'erreur. Si il y a plusieurs erreurs peu graves, la compilation peut se poursuivre et on verra plusieurs indications, mais la barre en surbrillance ne sera que sur la première erreur. C'est pour cela que c'est bien d'avoir les numéros de lignes affichées.

En dessous c'est la ligne incriminée avec un curseur sur le lieu, au cas ou la ligne serait longue.

Avec deux erreurs

Une erreur de point-virgule est tellement grave qu'il n'affiche que cette erreur. Remettez ce point virgule, et rajoutez la lettre e à begin et à println. Vous allez avoir ainsi deux erreurs. Pour la première:

Cours:2:10: error: 'class HardwareSerial' has no
  member named 'begine'; did you mean 'begin'?".

Sympa non? il vous propose le bon mot.

Il propose aussi pour la deuxième erreur le mot println au lieu de printlne. Mais ce ne sera pas toujours le cas.

Tout en bas est repris la première erreur, avec la raison. Et comme le curseur (ligne en surbrillance) est sur le cette ligne, est est plus facile à corriger. Quand on a un programme avec plusieurs erreurs, on peut ne corriger que la première, ce qui est plus facile à faire, recompiler pour avoir la deuxième... etc.

Syntaxe ou algorithme?

Les erreurs que nous avons faites jusqu'à présent sont des erreurs de syntaxe. Ce sont des fautes d'orthographe ou de grammaire. Par conséquent le compilateur peut dire qu'il y a une erreur et c'est facile à corriger. Les erreurs d'algorithmes sont plus compliquées. Vous donnez des ordres, mais la suite des ordres n'est pas bon. Le programme est syntaxiquement juste, le compilateur accepte, mais le résultat n'est pas celui attendu.

Nous allons quand même tester ce type d'erreur: inversez les deux lignes de code que l'on a rajouté, mettez d'abord la ligne qui écrit, puis la ligne qui initialise la liaison. Exécutez ce programme. La compilation se passe bien, mais rien ne s'affiche. Dans les cas un peu plus complexes, c'est parfois un problème pour retrouver l'erreur. On verra quelques méthodes pour retrouver le "pourquoi cela ne fonctionne pas". Dans le cas présent on commence par envoyer des caractères sur une ligne série qui n'est pas initialisée. Rien ne part. C'est un peu comme si on appuie sur la pédale d'accélérateur sans avoir mis le contact et que l'on se pose la question "pourquoi d'habitude le moteur vrombit et pas cette fois-ci?". Dans notre cas c'est facile parce que vous avez la solution, mais si vous aviez oublié qu'il faut initialiser la voie série, vous risquez de ne pas comprendre.

Vous voulez d'autres erreurs? Ce n'est pas difficile vous allez en faire sans le vouloir! Normalement je fais au moins une erreur de syntaxe pour 5 lignes de code et une erreur de raisonnement pour 20 lignes. Il n'y a pas de raison que vous n'en fassiez pas autant.