Direttive

Sto cercando di trasmettere una direttiva dal file ino alla mia biblioteca (.h et .cpp).
Io pensavo di fare cosi:
definisco cosi nel mio .ino

#define SSD1306

Nel .h ho fatto

#ifdef SSD1306
void init(Adafruit_SSD1306& tft);
#else
void init(MCUFRIEND_kbv& tft);
#endif
..............
#ifdef SSD1306
Adafruit_SSD1306 _tft;
#else
MCUFRIEND_kbv _tft;
#endif

e nel cpp

#ifdef SSD1306
void SavSegNumFast::init(Adafruit_SSD1306& tft)
{
  _tft = tft;
}
#else
void SavSegNumFast::init(MCUFRIEND_kbv& tft)
{
  _tft = tft;
}
#endif

ma mi da il seguente errore

/tmp/ccOM3Far.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x3fa): undefined reference to `SavSegNumFast::init(Adafruit_SSD1306&)'
collect2: error: ld returned 1 exit status

se faccio la definizione nel .h funziona, ma io vorrei scegliere la definizione dallo sketch per non andare a modificare la libreria ogni volta. Come si può fare?

Forse conviene che posti tutto il codice. Non mi è chiaro
Le tue funzioni mi pare si chiamano init()
L’errore descrive invece di mancanza di initSSD1306()

Scusami. Ho fatto una modifica al mio .h e non ho aggiornato pero’ l’errore

Il mio .h

#ifndef SavSegNumFast_h
#define SavSegNumFast_h
 
//#define SSD1306
   
#include <Arduino.h>
#include <MCUFRIEND_kbv.h>
#include "Adafruit_SSD1306.h"

class SavSegNumFast
{
public:
SavSegNumFast();
void setDim(uint16_t l=10, uint16_t h=17, uint16_t hs=3, uint16_t inr=12);// l=segment length; h=segment heigth; hs= segment thickness, inr=Whitespace character
void setColors(uint16_t color, uint16_t bColor);//color=segment color; bColor= back color
void printSegNumNoTime(uint16_t posX, uint16_t posY, char charToPrint[]);
void printSegNum(uint16_t posX, uint16_t posY, char charToPrint[]);
uint32_t printSegNumTime(uint16_t posX, uint16_t posY, char charToPrint[]);
#ifdef SSD1306
void init(Adafruit_SSD1306& tft);
#else
void init(MCUFRIEND_kbv& tft);
#endif
private:
void VerticalC(uint16_t posx, uint16_t posy);
void HorizontalC(uint16_t posx, uint16_t posy);
void Vertical(uint16_t posx, uint16_t posy);
void Horizontal(uint16_t posx, uint16_t posy);
uint8_t _contSeg, _contNum;
int16_t _l, _h, _hs, _inr;
uint16_t _color, _bColor;
#ifdef SSD1306
Adafruit_SSD1306 _tft;
#else
MCUFRIEND_kbv _tft;
#endif
};
    
#endif

Il .ino ho messo

#define SSD1306
//#include <MCUFRIEND_kbv.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SavSegNumFast.h>
#include "Fonts/FreeSansBold92.h"
#include "Fonts/FreeCaligraffittiBoldOblique44.h"
#include <Fonts/FreeMono12pt7b.h>


extern uint8_t SmallFont[];
extern uint8_t BigFont[];
//extern uint8_t SevenSegNumFont2[];


//#define LCD_CS    A3 // Chip Select goes to Analog 3
//#define LCD_RS    A2 // Command/Data goes to Analog 2
//#define LCD_WR    A1 // LCD Write goes to Analog 1

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 tft (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//MCUFRIEND_kbv tft;
SavSegNumFast ssn;




void setup()
{

  ssn.init(tft);
......

Quindi vuol dire che il #define SSD3106 presente nello sketch non lo trasmette al .h
Se invece tolgo come commento nel .h il #define SSD1306 compila senza errori.
Io vorrei controllare dal mio sketch questa direttiva senza dover modificare la mia libreria commentando o no questo define per utilizzare una libreria ( Adafruit_SSD1306.h) o l’altra (MCUFRIEND_kbv.h).

Credo sia dovuto a come Arduino ide compila i pezzi. Un normale compilatore, tipo Visual c++ o eclipse gli dai un progetto con i vari file e lui compila tutto assieme. Arduino ide compila in maniera particolare, "separata". Non ricordo bene però esattamente come.

nid69ita:
Credo sia dovuto a come Arduino ide compila i pezzi.

... esatto, se ne è parlato parecchio in passato, se si fa qualche ricerca magari si trova :wink:

Guglielmo