Modificare libreria ... Esportare un valore

Buona sera, forse è un argomento più da forum di programmazione c++ che di progetti arduino, ma ci provo comunque, sono diversi giorni che cerco e faccio prove ma non riesco a uscirne e le librerie c++ per quanto abbia letto qua e la non riesco a comprenderle del tutto, capisco cosa fanno i vari pezzi isolati, ma nell'insieme di salti e dichiarazioni mi perdo. Spero qualcuno riesca a illuminarmi, mi piacerebbe imparare qualcosa di più sulle librerie.

All'interno di una libreria viene fatto un parse di un header http, viene smembrata per rcavare valori che servono alla libreria stessa, mi sono fatto una variabile a parte e ho riunito tutti i char per ottenere un unica una striga (parliamo del file cpp)

headerString.concat(ch1);

Quindi facendo un serial print dentro la libreria vedo il blocco che mi serve sul serial monitor mentre è in esecuzione, ora questa stringa lo voglio esportare sul serial non mi serve a nulla

ho dichiarato nella Lib.h nelle sezione pubbica

public:
String getStr() ;

nella lib.cpp ho messo le dichiarazioni all'inizio

char ch1;
String headerString="";
....
....
String Lib::getStr()
{
return headerString;
} ;

tutto viene compilato senza errori, ma non so come prendere questa stringa dallo scketch

se metto nello sketch:
void header_get()
{
String prova = Lib.getStr();
}

ottengo questo errore ...> error: expected primary-expression before '.' token

se metto nello sketch:
void header_get()
{
String prova = Lib::getStr();
}

ottengo questo errore ...> error: cannot call member function 'Lib::getStr()' without object

cosa sbaglio? come faccio a prelevare questo valore dallo sketch?

grazie

Una volta definita la classe e i metodi, nello sketch devi creare un oggetto che avrà tutte le caratteristiche della classe.

Dal pezzo dello sketch non si capisce se l'hai dichiarato o no.

pablos non ci ho capito nulla, scusa.
Allora stai imparando a programmare in C++?

Sembra proprio di si.

Sbagli perché non crei instanza della classe Lib, io ad esempio non vedo il costruttore nel poco codice che hai scritto.

// file header nome a piacere.h
// definisci classe
class MyClass
{
// tutti i mebri dichiarati qui sono privati
public:
String myStringMember;
int myIntMember;
};

// file cpp nome a piacere.cpp
// Implementazione
MyClass::MyClass() : myStringMember("inizializzo l'oggetto stringa")
{
// costruttore vuoto abrv. ctor
// al posto di ": myStringMember("inizializzo l'oggetto stringa")" puoi inizializzare l'oggetto nel costruttore

}

// Member function of class 
// return myStringMember 
String MyClass::getMyStringMember()
{
     return myStringMember;
}

// sketch 

// crea instanza di classe
MyClass myClass;
// chiamata a funzione membro di classe attraverso l'instanza di classe creata prima, myClass è un oggetto
String m_string = myClass.getMyStringMember();

Dotati di un libro C++ e studia le fondamentali seguendo gli esempi sviluppando per pc, no arduino.

Ciao.
Corretto, mancava un ; a fine defizione

Forse, dico solo forse, ci aiuterebbe ad aiutarti se ci dai la libreria intera :wink: :wink: :wink:

Ciao Uwe

Si avete ragione, così è poco chiaro, diciamo che in un unico programma faccio tutto non ho grossi problemi col c++, ho grosse diccoltà a collegare più file tra loro richiamandoli e dichiarando le varie parti, tanto è vero che prelevo i pezzi di librerie che mi servono e le implemento negli shetch, e tiro via gli include :slight_smile: e tutto funziona bene (parliamo di librerie non standard di arduino), ma qui non posso.

Grazie per la disponibilità, domani preparo i file

ciao

Si avete ragione, così è poco chiaro, diciamo che in un unico programma faccio tutto non ho grossi problemi col c++, ho grosse diccoltà a collegare più file tra loro richiamandoli e dichiarando le varie parti, tanto è vero che prelevo i pezzi di librerie che mi servono e le implemento negli shetch, e tiro via gli include smiley e tutto funziona bene (parliamo di librerie non standard di arduino), ma qui non posso.

Io invece dico che hai qualche problema con il C++, in particolare con le classi, per questo ti consiglio di studiare una risorsa on line al fine di prendere confidenza con le classi.

Il primo errore:
ottengo questo errore ...> error: expected primary-expression before '.' token

Si aspettava una espressione primaria prima del token '.'

Lib.getStr();
Presuppone che l'instanza di classe Lib sia stata creata e che questa è stata conservata nella variabile Lib.
Il punto risolve l'accesso ai membri publici dell'oggetto Lib creato prima.

Secondo errore:

ottengo questo errore ...> error: cannot call member function 'Lib::getStr()' without object
Non posso chiamare la funzione membro Lib::getStr() senza l'oggetto
Lib::getStr();

Questa chiamata avrebbe avuto senso se avessi definito il metodo getStr membro statico della classe Lib, allora l'operatore di
visibilità da usare è "::". Questo risolve lo scope.

Ciao.

MauroTec:
Io invece dico che hai qualche problema con il C++, in particolare con le classi, per questo ti consiglio di studiare una risorsa on line al fine di prendere confidenza con le classi.
Ciao.

In realtà mi ero intestardito a utilizzare le classi già presenti, ma non sono stato capace di ampliarle troppo complicata e lunga per entrare nella mente del creatore, così ne ho aggiunta una nuova.
Probabilmente avrò gravi problemi di c++, comunque mancava una riga di dichiarazione della classe aggiunta nello sketch, grazie per l'esempio postato ora posso aggiungere il login base64 sulla libreria

bye bye

mettendola giù brutalmente, Lib è il tipo di dato, come int o float. se provi a fare int = 5, vedrai come si inca**a il compilatore!

esattamente come in questo caso tu vorresti una variabile di tipo int, tu vuoi una variabile di tipo Lib.

e tra l'altro, questa variabile di tipo Lib non deve essere una a caso, ma proprio quella in cui hai buttato i char fino ad ora!

discorso un pò diverso se la classe è statica, ma molto probabilmente on è il caso