Erreur compilation programmation en C

Bonjour à tous.
Débutant en programmation C, J'essaie en vingt de comprendre pourquoi je n'arrive pas à faire compiler une fonction écrite dans un fichier en .c à partir du fichier .ino.
Après pas mal de recherche et d'essais, je calle, besoin donc d'aide svp

fichier ino de base

//BIBLIOTHEQUES
#include <Arduino.h>
#include <Wire.h>

#include  "affichageLcd.h"
extern void affichageLcd(LiquidCrystal_I2C lcd, float consigneTheorique);
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // objet pour le LCD


    float consigneTheorique = 1.0;

  void setup () {
    lcd.init();
    delay(50);

    }// fin setup

  void loop () {
  
  affichageLcd(lcd, consigneTheorique);

    }//fin

le fameau fichier .c

#include "affichageLcd.h"
#include <LiquidCrystal_I2C.h>

    ////////////////////////$$$$$$$$$$$$$$$     LCD     $$$$$$$$$$$$$$$/////////////////
  ////////////////////////$$$$$$$$$$$$$$$             $$$$$$$$$$$$$$$/////////////////
extern "C" void affichageLcd(LiquidCrystal_I2C lcd, float consigneTheorique){

            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("C=");//5 char
            lcd.print(consigneTheorique);
            delay(5000);

}// fin fct

et son header

#ifndef AFFICHAGE_LCD
#define AFFICHAGE_LCD

        #ifdef __cplusplus
        extern "C" {
        #endif

extern "C" void affichageLcd(LiquidCrystal_I2C lcd, float consigneTheorique);
        #ifdef __cplusplus
        }
        #endif

#endif

Bonjour,

  • Dans ton fichier .h tu as à la fois un extern "C" conditionnel et un extern "C" inconditionnel.
  • Tu utilises des class C++ dans un programme C
    void affichageLcd(LiquidCrystal_I2C lcd, float consigneTheorique);
  • Tu utilises extern dans la défintion d'une fonction
    extern "C" void affichageLcd(LiquidCrystal_I2C lcd, float consigneTheorique) {

Commence par transformer ton fichier .c en fichier .cpp

@tonynyny Ne postez pas dans les tutos SVP... déplacé dans le forum principal

et en trente ? :slight_smile:

j'ai corrigé depuis les fichiers
pour le header

#ifndef AFFICHAGE_LCD
#define AFFICHAGE_LCD


    #ifdef __cplusplus  // pour eviter le name mangling du compileur C++
    extern "C" {
    #endif

    void affichageLcd(float consigneTheorique); // pour eviter le name mangling du compileur C++
          
    #ifdef __cpluscplus
    }
    #endif

    //extern LiquidCrystal_I2C lcd;


#endif

pour le .C, que j'ai transformé en C++ du coup

#include "Arduino.h"
#include "affichageLcd.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // objet pour le LCD

    ////////////////////////$$$$$$$$$$$$$$$     LCD     $$$$$$$$$$$$$$$/////////////////
  ////////////////////////$$$$$$$$$$$$$$$             $$$$$$$$$$$$$$$/////////////////
void affichageLcd(float consigneTheorique){

            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("C=");//5 char
            lcd.print(consigneTheorique);
            delay(5000);

}// fin fct

et le main

//BIBLIOTHEQUES
#include "Arduino.h"
#include <Wire.h>

#include  "affichageLcd.h"
//extern "C" void affichageLcd(float consigneTheorique);
//extern LiquidCrystal_I2C lcd;



  float consigneTheorique = 1.0;

  void setup () {
    //lcd.init();
    delay(50);

    }// fin setup

  void loop () {
  
  affichageLcd(consigneTheorique);

  }//fin

Mais toujours erreur de compilation

je dois meme être à 50 maintenant :joy:

affichageLcd() ne peut pas être du C puisque vous utilisez le C++ dans la fonction pour parler à l'instance du LCD

ouch...
est-ce que cela veut dire que si je veux utiliser la biblio du LCD, je suis obligé d'écrire toute la fonction affichageLcd() en respectant le codage C++ ?

Ca veut dire quoi respecter le codage C++?
Il faut que ta fonction soit compilée en C++

ben vous devez être comme Mr Jourdain, vous faites du C++ sans le savoir :slight_smile: parce que

            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("C=");//5 char
            lcd.print(consigneTheorique);

c'est des appels de fonctions membres sur une instance de la classe LiquidCrystal_I2C... c'est du C++...

jetez un oeil ici et aux 3 fichiers

le code est ici

le fichier.ino

#include "lcd.h"
void setup() {
  lcdInit();
  disBonjour();
}

void loop() {}

lcd.h

#ifndef _LCD_H_
#define _LCD_H_
#include <LiquidCrystal_I2C.h>

void lcdInit();
void disBonjour();

#endif

lcd.cpp

#include "lcd.h"

#define I2C_ADDR    0x27
#define LCD_COLUMNS 16
#define LCD_LINES   2

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

void lcdInit() {
  lcd.init();
  lcd.backlight();
}

void disBonjour() {
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("BONJOUR!");
}

je débute tout juste en C, alors rajouter le C++, ça me perturbe vite.

Ce que je voulais dire, c'est est-ce qu'il y a nécessité de respecter la syntaxe du C++ pour qu'un fichier en C++ puisse être compilé. Ou alors on peut très bien avoir un mixte de syntaxe C et C++ dans un fichier .cpp et pouvoir faire une compilation sans erreur ?
A moins que je me trompe, C et C++ diffèrent sur certaine syntaxe.

c'est qui Mr Jourdain ? Connait pas :stuck_out_tongue:
Et oui, vous avez raison, j'ai eu pour habitude d'utiliser ce genre de syntaxe sans me poser la question du language, mais maintenant que je m'y met, je devrais faire plus attention ^^

merci pour les fichiers, je vais essayer de m'en inspirer

non vous pouvez y aller :slight_smile: (il y a quelques différences mais pas sur la syntaxe)

ah ces jeunes qui ne connaissent pas leurs classiques.. (Le Bourgeois gentilhomme)

Dans l'acte II, scène IV, Monsieur Jourdain apprend, au cours d'un échange avec son maître de philosophie, qu'il dit de la prose depuis longtemps, sans le savoir :

« Par ma foi ! il y a plus de quarante ans que je dis de la prose sans que j'en susse rien, et je vous suis le plus obligé du monde de m'avoir appris cela. »

Par extension, Monsieur Jourdain désigne quelqu'un pratiquant une activité sans même avoir connaissance de son existence.

:joy: je pensais que vous parliez d'un membre du forum
Bourgeois gentillhome, ça fait quand meme plus de 20ans que je l'ai lu au collège :joy:

Sinon, merci pour vos réponses, j'ai finalement réussi à corriger toutes les erreurs et à compiler.
A moi d'appronfondir tout cela pour progresser.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.