Incompréhension de compilation


salut,
donc je crée un nouveau post pour ce problème de compilation sur mega 2560,dés que je crée un fichier annexe...
voici un exemple
mon progprinc.ino
code: [select]

#include <spi.h>
#include <sd.h>
#include <mstimer2.h>
#include <rtclib.h>
#include <wire.h>
#include "cryptdecrypt.h"

// port série
//serial3 rs485 sur pin(15-rx, 14-tx)
//serial2 rs232 sur pin(17-rx, 16-tx)

// constante enregistrement des fichiers
#define max_dirname_len         9
#define max_filename_len        14

// variables globales
bool initok = true;
volatile bool recordrunning = false;
volatile bool resetrunning = false;
volatile bool supportpres = true;

// enregistrement des fichiers
char dirname[max_dirname_len];
char filename[max_filename_len];

// variables dm
unsigned int nbreceivedbyte;
int nbbytetoread;
unsigned int zonetoread;
bool s33;
bool timeout;

// pour afficher un date time
unsigned char timestamp[30];

// rtc
rtc_ds1307 rtc;
//rtc_pcf8523 rtc;

// réccupération de la date actuelle
datetime now;

//==============================================================================
// fonctions d'interruption
void intrecord(void);
void intreset(void);
void intsupportlost(void);
void intgetsupport(void);

//==============================================================================
// fonctions gestion ihm
void clignoencours();
void clignoledverte(void);
void clignoledrouge(void);
void recordstate(const bool pledrecordko, const bool pledrecordok);
void resetstate(const bool pledresetko, const bool pledresetok);
void testihm(void);

//==============================================================================
// fonctions gestion relais
void pilotermode(const int pmode0, const int pmode1, const int pdetect, const int pvaux, const int prreset);
void piloterdiscret(const int paicfli_1, const int paicfli_2, const int ppinprog_2, const int pbatwup_1, const int pbatwup_2, const int pemedis, const int pj2start);
void switchoffbat(void);

//==============================================================================
// fonctions reset
bool miseenroute(const unsigned int pbatflt1);
extern bool resetbat(const unsigned int pputrdy, const unsigned int psocrdy);

//==============================================================================
// fonctions lecture dm
bool lecturedmdata(char *pdirname);
bool lecturezone(unsigned char pfirstpagetoread, unsigned char pnbpagetoread, char *pdirname, char *pfilename);
bool getrs485data(char *pdirname, char *pfilename);
bool getdata(char *pdirname, char *pfilename);
char *str_sub (const char *, unsigned int, unsigned int);
bool getbatfault1(const unsigned int pbatflt1);
bool switchoffbatfault1(const unsigned int pbatflt1);
void rdytoreaddm(void);

//==============================================================================
// fonctions pld_ufd
bool rdytoreadpldufd(const unsigned int pbatflt1);
bool lecturepldufd (char *pdirname, const datetime pnow);
unsigned char miseenforme(unsigned char buffer_rs232_127_bytes[128], unsigned char *pdatatowrite, const datetime pnow);
unsigned char ascciitohex(unsigned char pval);

//==============================================================================
// gestion du temps
void datetime(uint16_t* date, uint16_t* time);
// displaytime: affiche la date et l'heure
void displaytime(datetime dt);
// secondes du rtc lors du dernier affichage
int lastdisplaysec = -1;

/*******************************************************************
 *                           setup                                 *
 *******************************************************************/
void setup() {

  // code de mise en route

}

/*******************************************************************
 *                           loop                                  *
 *******************************************************************/
void loop() {

  // si le setup() est ko, on empeche toute action --> obligé de faire un reset alimentation
  if(!initok){
    
    clignoledrouge();
    delay(250);
  }else{
    // réccupération de la date actuelle
    now = rtc.now();
    
    // si les secondes ont changées, on raffraichie l'affichage
    if ( now.second() != lastdisplaysec ) {
      serial.println("display time");
      displaytime(now);
      lastdisplaysec = now.second();
    }
    
    // présence support
    if(!supportpres)
      recordstate(led_on, led_off);
        
    /********************************************************************************************************************
     *                                                      record                                                      *
     ********************************************************************************************************************/
    if(supportpres && recordrunning){
      
      // affichage de l'opération en cours
      mstimer2::start();
      
      // extinction des leds
      resetstate(led_off, led_off);
      recordstate(led_off, led_off);
      
      // reset des relais
      switchoffbat();
      
      /==============================================================================
      // lecture dm
      //==============================================================================
      if(!supportpres || !(recordrunning = getbatfault1(bat_flt_1)))// mise en route avec bat_fault_1  
        recordstate(led_on, led_off);
      else if(!supportpres || !(recordrunning = switchoffbatfault1(bat_flt_1))) // extinction bat_fault_1
        recordstate(led_on, led_off);
      else if(supportpres){
        
        // prêt à lire la dm
        rdytoreaddm();
    
        // voir req-sld-0120??

        // lecture données dm
        if(!supportpres || !(recordrunning = lecturedmdata (dirname)))
          recordstate(led_on, led_off);        
      }    
      
      //============================================================
      // fin lecture dm
      //============================================================

     //// et mon code continue comme ça.....
}
/*******************************************************************
 *                         fin loop                                *
 *******************************************************************/


je vous épargne les 1600 lignes......

ensuite mon cryptdecrypr.h
code: [select]

//==============================================================================
//
// title:    cryptdecrypt.h
// purpose:   fonction de gestion cryptage décryptage.
//
// created on:  27/06/2017 @ 09:51:50 pascal.
// copyright: saft. rights reserved.
//
//==============================================================================
#ifndef cryptdecrypt_h
#define cryptdecrypt_h

//==============================================================================
// include files
#include <arduino.h>
#include <aeslib.h>

#ifdef __cplusplus
    extern "c" {
#endif

// définition des clé de cryptage
uint8_t key[16] = {'m', 'a', 'c', 'l', 'e'}; // 16 caractères
uint8_t vecteur[16] = {'m', 'o', 'n', 'v', 'e', 'c', 't', 'e', 'u', 'r'}; // 1- caractères

//==============================================================================
// global functions        
extern void cryptaes128cbcdata(unsigned char *data);
extern void decryptaes128cbcdata(unsigned char *data);

#ifdef __cplusplus
    }
#endif

#endif // cryptdecrypt_h


et voici l'erreur que j'obtiens
code: [select]



sketch\progprinc.ino.cpp.o (symbol plugin): in function `intrecord()':

(.text+0x0): multiple definition of `vecteur'

sketch\cryptdecrypt.cpp.o (symbol plugin):(.text+0x0): first defined here

c:/users/burelp/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: disabling relaxation: not work multiple definitions

sketch\progprinc.ino.cpp.o (symbol plugin): in function `intrecord()':

(.text+0x0): multiple definition of `key'

sketch\cryptdecrypt.cpp.o (symbol plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
erreur de compilation pour la carte arduino/genuino mega or mega 2560

sans oublié de dire que les variables vecteur et key ne sont utilisée que ici et que je n'utilise pas ces fonctions (pour le moment), donc si j'enlève le #include "cryptdecrypt.h", ça compile parfaitement....
merci pour vos lumières...

bonsoir

le problème vient du fait que les tableaux key et vecteur sont définis (et initialisés) dans le fichier d'en-tête cryptdecrypr.h. en incluant ce fichier dans le fichier .ino alors qu'il l'est déjà dans cryptdecrypt.cpp, ces définitions apparaissent deux fois durant la compilation.

les tableaux devraient être seulement déclarés dans cryptdecrypr.h afin de servir d'interface, et définis dans cryptdecrypt.cpp.


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Incompréhension de compilation


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts