Erreur compilation prototype language c++

Bonjour à tous.
J'ai un fichier .hpp dans lequel j'ai le prototype suivant:
int sortie(unsigned int pinNUmber, float consigne=0.0);

En essayant de compiler avec l'ide arduino, j'ai l'erreur suivante :

error: expected ';', ',' or ')' before '=' token
 int sortie(unsigned int pinNUmber, float consigne=0.0);

Or, à ce que je sache, en cpp, on a le droit d'initialiser les arguments du prototype pour les rendre facultatifs.

Alors Pourquoi la compilation ne l'accepte pas ?

Merci pour vos éclaircissements.

À confirmer, mais il me semble que dans le prototype on définit le type mais les valeurs par défaut sont définies dans le cpp avec la fonction.

Dans le hpp

int sortie(unsigned int pinNUmber, float consigne);

dans le cpp

int sortie(unsigned int pinNUmber, float consigne=0.0);

Bonjour,

La déclaration est correcte. L'erreur vient sans doute d'ailleurs.

Par contre la définition de la fonction devrait être au minimum
int sortie(unsigned int pinNUmber, float consigne=0.0)
{
return 0;
}

Oui, il faudrait voir les quelques lignes autour de celle-ci. Au moins.

on utilise hpp généralement quand on met le .h et le .cpp ensembles
(on met bien la valeur par défaut dans le .h et pas dans le .cpp)

@tonynyny - pourquoi hpp et pas un .h et .cpp ?
pouvez vous poster un exemple minimal ?

@J-M-L

Parce que j'ai appris cela sur le cours c++ de openclassroom. J'étais au départ parti sur du .h, pensant que c'était le problème, j'ai donc respecter la norme en mettant .hpp mais toujours même erreur.

Un exemple concret plus light et qui me fait la même erreur :

fichier .cpp :

#include "write.h"


void write(unsigned int pinNumber, float consigne, int mode){

    switch (pinNumber)
    {

    }//fin switch

}

et le header en .h


#ifndef WRITE
#define  WRITE



void write(unsigned int pinNumber, float consigne=0.0, int mode=0);


#endif 

je précise que je suis un un board custom equivalent à la minima.

Après des heures de recherche cette soirée, je ne comprend pas du tout d'où provient l'erreur...

Dans ton programme il n'y a pas d'include "write.h" ? Et lr compilateur trouve quand même write.

Est ce qu'il n'y a pas une fonction write() déjà définie dans le framework?

Qu'est-ce que c'est ce package?

Ce n’est qu’une convention - le .h est tout aussi utilisé

On trouvera souvent un .hpp quand vous mettez le code aussi dans le fichier et pas uniquement les headers - en gros une des conventions c’est .hpp = .h + .cpp réunis

Si vous avez des classes pure virtual alors on utilisera le .hpp

j'ai mis la fonction write.cpp et son header directement dans le dossier "/cores/" là où se trouve toutes les fonctions arduinos digital, analog et autres.
J'ai ensuite include write.h dans le fichier main.cpp
C'est pour cela que je n'ai plus besoin de l'include dans le .ino

C'est peut etre la que je fais l'erreur ? Cad d'utiliser le dossier /cores/ ?

c'est une simple copie du package uno r4 avec les pins modifiés

Ok, c'est noté merci.
Mais qu'est ce qu'une "classes pure virtual" ?

Je dois faire une manip que l'ide n'aime pas, lorsque j'essai exactement le même code, mais écrit entièrement cette fois ci dans le fichier . ino, ça compile sans erreur

void write(unsigned int pinNumber, float consigne=0.0, int mode=0);

void setup() {}


void loop() {
  
  write(2,1);

}


void write(unsigned int pinNumber, float consigne, int mode){
    switch (pinNumber){}
}

autre test, cette fois, quand je met les fichiers write.h et write.cpp directement dans le même dossier que le sketch .ino, et bien ça compile sans erreur le code suivant (code du sketch) :

#include "write.h"

void setup() {}


void loop() {
  
  write(2,1);

}

:unamused:

edit:
et rebelotte, dès que je remet les fichiers de la fonction write dans le dossier cores du package, erreur de compilation à nouveau, la même erreur

regardez dans le répertoire temporaire de compilation ce qui est généré

dans l'absolu, si vous utilisez l'IDE évitez de toucher aux dossiers spécifiques

repertoire temp/arduino/scketches
lequel des fichiers ?

image

Si il n'y aucune solution, c'est que je ferais... mais j'aimerais bien comprendre ce beug avant.

quand vous compilez avec l'IDE il commence par copier vos fichiers dans un répertoire temporaire dédié à votre sketch

sur mon Mac, par exemple si je compile un sketch vide sans nom il met tout dans

/var/folders/96/rsjd0mkd3xn0whm5622w0f500000gn/T/arduino_build_208298/

vous pouvez voir ainsi ce qui est réellement compilé

--

sinon il y a quoi dans vos fichiers write.cpp et .h ?

Dans le dossier sketch de mon post#16, il y a un fichier sketch qui contient :

#include <Arduino.h>
#line 1 "C:\\Users\\PC\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2024011-2828-1gfqr00.tn6w\\sketch_jan11a\\sketch_jan11a.ino"
#line 1 "C:\\Users\\PC\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2024011-2828-1gfqr00.tn6w\\sketch_jan11a\\sketch_jan11a.ino"
void setup();
#line 4 "C:\\Users\\PC\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2024011-2828-1gfqr00.tn6w\\sketch_jan11a\\sketch_jan11a.ino"
void loop();
#line 1 "C:\\Users\\PC\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2024011-2828-1gfqr00.tn6w\\sketch_jan11a\\sketch_jan11a.ino"
void setup() {}


void loop() {
  
  write(2,1);

}

Ce que j'ai donné plus haut:
Write.cpp

void write(unsigned int pinNumber, float consigne, int mode){
    switch (pinNumber){}
}

et write.h

void write(unsigned int pinNumber, float consigne=0.0, int mode=0);

et si vous mettez

Write.h

// Write.h

#ifndef WRITE_H
#define WRITE_H
void write(unsigned int pinNumber, float consigne = 0.0, int mode = 0);
#endif  // WRITE_H

et Write.cpp

#include "Write.h"

void write(unsigned int pinNumber, float consigne, int mode){
    switch (pinNumber){}
}

idem, même erreur.

J'avais auparavant aussi essayé de renommer les fichiers en write2