ERRORE NELLA SCRITTURA DI UNA LIBRERIA

Qualche giorno fa ho deciso di scrivere una libreria per pilotare un display 7 segmenti, 4 digit, catodo in comune con arduino. So già che sul web ne esistono sicuramente moltissime al riguardo , ma volevo scriverla io, la libreria, per comprenderne meglio il funzionamento.

Purtroppo però dopo aver scritto il file header e il source, e dopo aver scritto un semplice sketch per testarne il funzionamento mi da il seguente errore

Arduino:1.6.6 (Windows 10), Scheda:"Arduino/Genuino Uno"

C:\Program Files (x86)\Arduino\libraries\SevenSegments\SevenSegments.cpp:26:5: error: prototype for 'int SevenSegments::stampa(int, int)' does not match any in class 'SevenSegments'

 int SevenSegments::stampa(int A, int D)

     ^

In file included from C:\Program Files (x86)\Arduino\libraries\SevenSegments\SevenSegments.cpp:8:0:

C:\Program Files (x86)\Arduino\libraries\SevenSegments\SevenSegments.h:23:9: error: candidate is: void SevenSegments::stampa(int, int)

    void stampa(int A, int D);

         ^

exit status 1
Errore durante la compilazione

File header

#ifndef SevenSegments_h
#define Sevensegments_h

#include "Arduino.h"

class SevenSegments
{
  public:
    SevenSegments(int a, int b, int c, int d, int e, int f, int g, int h, int D1, int D2, int D3, int D4);
    int number(int _x);
  private:
   int x;
   int unit;
   int migliaia;
   int centinaia;
   int decina;
   int unita;
   void stampa(int A, int D);
   
};

#endif

File source

#include "Arduino.h"
#include "SevenSegments.h"

SevenSegments::SevenSegments(int a, int b, int c, int d, int e, int f, int g, int h, int D1, int D2, int D3, int D4)
{
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(h, OUTPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
}

int SevenSegments::stampa(int A, int D)
{
 switch (A){
  case 0:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
  case 1:
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
  case 2:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 3:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 4:
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 5:
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 6:
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 7:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
  case 8:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
  case 9:
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
 }
 switch (D){
  case 1:
  digitalWrite(D4, HIGH)
  digitalWrite(D3, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D1, LOW);
  case 2:
  digitalWrite(D3, HIGH)
  digitalWrite(D4, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D1, LOW);
  case 3:
  digitalWrite(D2, HIGH)
  digitalWrite(D3, LOW);
  digitalWrite(D4, LOW);
  digitalWrite(D1, LOW);
  case 4:
  digitalWrite(D1, HIGH)
  digitalWrite(D3, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D4, LOW);
 }
int SevenSegments::number(int _x)
{
  if (_x >= 0 && _x < 10000){
    x = _x;
  }
  else{
   x = 9999;
  }
  if( x >= 0 && x <= 9){
    unit = 1;
  }
  else if( x >= 10 && x <= 99){
    unit = 2;
  }
  else if( x >= 100 && x <= 999){
    unit = 3;
  }
  else if( x >= 1000 && x <= 9999){
    unit = 4;
  }
  switch (unit){
    case 1:
    do{
      stampa(x, 1);
    } while(x = _x);
    case 2:
    do{
      decina = x/10;
      stampa(decina, 2);
      delay(20);
      unita = x - (decina*10);
      stampa(unita, 1);
      delay(20);
    } while(x = _x);
    case 3:
    do{
      centinaia = x/100;
      stampa(centinaia, 3);
      delay(10);
      decina = (x - centinaia*100)/10; 
      stampa(decina, 2);
      delay(10);
      unita = (x - centinaia*100) - (decina*10);
      stampa(unita, 1);
      delay(10);
      } while(x = _x);
    case 4:
    do{
      migliaia = x/1000;
      stampa(migliaia, 4);
      delay(7);
      centinaia = (x - migliaia*1000)/100;
      stampa(centinaia, 3);
      delay(7);
      decina = (x - migliaia*1000 - centinaia*100)/10;
      stampa(decina, 2);
      delay(7);
      unita = x - migliaia*1000 - centinaia*100 - decina*10;
      stampa(unita, 1);
      delay(7);
    } while(x = _x);
  }
}

Sketch di prova

#include <SevenSegments.h>
SevenSegments ssg(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
void setup(){
  
}
void loop(){
  ssg.number(5);
}

Spero possiate aiutarmi

La definizione del metodo stampa è la seguente:

int SevenSegments::stampa(int A, int D)

Il metodo restituisce un dato di tipo int

mentre la dichiarazione (cioè il prototipo) nel file header è la seguente:

void stampa(int A, int D);

qui invece il metodo restituisce void

Quindi dovresti risolvere modificando la definizione, togliendo int e al suo posto inserendo void

void SevenSegments::stampa(int A, int D)

Tutto qui.

Ciao.

Grazie mille, ho sistemato sostituendo void al posto di int, ma ora è sorto un altro problema: Per le regole di visibilità non mi riconosce tutti i prametri del costruttore ( a, b, c, d, ecc..) che poi ho usato nella funzione stampa, infatti mi da questo errore: In member function 'void SevenSegments::stampa(int, int)' 'a' was not declared in this scope e lo ripete per ogni altro parametro del costruttore

Devi creare delle variabili private nella classe e copiarci i parametri. Se fanno parte della classe saranno poi visibili da tutti i suoi metodi.