Go Down

Topic: Creare Librerie (Read 21398 times) previous topic - next topic

BaBBuino

Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "Creare librerie per arduino", ti escono 50 link solo in italiano!

Maurotec


Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "Creare librerie per arduino", ti escono 50 link solo in italiano!


Che a seguirli tutti è una perdita di tempo dove non impari quasi nulla.

Chi riesce a condensare in 10 pagine l'argomento partendo da zero? Risposta: nessuno

Ciao.

BaBBuino


Salve,
qualcuno sa indicarmi una guida per creare librerie per arduino, ho comprato quattro libri sulla programmazione di arduino e nessuno di questi spiega come creare le librerire.
grazie



Mauro, rileggi bene la richiesta. Non deve diventare un professionista del C, ma creare librerie per Arduino.

E se ci sono riuscito io (che sono una pigna) con quegli articoli , ci può riuscire chiunque. E questo senza leggere libri esoterici o diventare un Guru del C++

leo72


Ma diamine! Siamo nel 2014 e ancora di questi post?

Digita su Google: "xxxxxxxxxx", ti escono yyy link solo in italiano!


Ecco, messo così lo si potrebbe applicare al 70% dei post che vengono pubblicati. :smiley-roll:

lestofante

però poi lui ha postato il codice chiedendo una valutazione e consiglio sull'organizzazione del codice.. cosa che solo noi poveri umani possiamo fare.

Certo, avesse conosciuto il linguaggio a fondo avrebbe visto subilto la soluzione, ma inzomma siam stati tutti nabbi.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

mastraa

Se io ho bisogno di una funzione che mi ritorni 3 valori float come posso fare?

E' meglio dichiarare tre variabili pubbliche poi utilizzarle nello sketch?

PaoloP

Se hai necessità che restituisca tre diversi valori potresti passarli come puntatori ed elaborarli all'interno della funzione oppure li dichiari globali e li hai sempre a disposizione.

mastraa


mastraa

Una delucidazione, spero sia l'ultima per vedere se ho capito bene:

Variabile public:
Le posso usare sia nelle funzioni della classe, sia al di fuori e rimangono definite per 'sempre'
Variale private:
Utilizzabili solo dentro alla classe, rimangono valide per 'sempre'
Variabile dichiarate dentro una funzione (di una classe o meno):
Valgono solo dentro quella funzione e vengono ridichiarate ad ogni ciclo

E' corretto?

Quindi se io ho bisogno di una variabile solo dentro una funzione di una classe, ma che rimanga anche alla chiamata successiva per una iterazione, la dovrei mettere private, se una mi serve averla sempre e accessibile 'dallo sketch' la devo mettere pubblica.
Se mi basta averla dentro a una funzione la dichiaro li dentro

lestofante

prima di tutto c'è il tempo di vita delle variabili.
Una variabile che viene istanziata all'interno di un blocco,muore alla sua fine.
Un blocco è delimitatato da { }
quindi una bariabile dichiartata in un blocco if, morirà al termine dell'if.

Poi c'è la visibilità;
una variabile/funzione/classe public è richiamabile all'esterno della classe;
una variabile/funzione/classe protected è richiamabile dalle sotto classi;
una variabile/funzione/classe private è richiamabile dalla classe che la istanzia;
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

mastraa

Riesumo nuovamente un topic sulle librerie per chiedere una spiegazione:

Innanzitutto ho trovato in giro delle librerie che non hanno bisogno di essere inizializzate dal costruttore, si tratta di librerie che non lavorano a classi?
(Ho letto che le librerie non per forza devono essere organizzate in classi, come si fanno queste ultime?)

Ad esempio prendiamo la libreria Wire.h... non ha il costruttore no? come faccio a creare una libreria simile?

Se poi io volessi usare una libreria dentro un'altra libreria, oppure una funzione di comodo dentro alla funzione che non uso all'esterno, ma che alcune funzioni della stessa libreria richiamano. Come devo dichiararla?

Faccio un esempio pratico: ho 2-3 funzioni che elaborano dei dati letti da un sensore I2C, per la lettura voglio fare una funzione a sé che richiamo senza scrivere ogni volta...la dichiaro sempre allo stesso modo type CLASS::function(){}? e quando la richiamo la chiamo senza il costruttore (che ovviamente dentro alla libreria non so visto che è a discrezione)?

Spero di essere stato chiaro, anche se mi rendo conto di essere stato un po' contorto in alcuni punti

mastraa

Ho fatto delle prove quindi esplicito meglio le mie domande e i miei dubbi:


  • Come funzionano le librerie senza classi di cui ho letto in internet e/o su qualche guida?

  • Una di queste è tipo la Wire? cioè una libreria che non ha bisogno di costruttore quando la uso? (per costruttore intendo qualcosa del tipo ClassName pinco; e poi uso pinco.function()...



Ho poi provato a vedere come funziona richiamare una funzione in una seconda funzione della stessa classe, ho visto che non serve il costruttore, ma se io ho bisogno di usare la funzione di un'altra classe o di un'altra libreria?
Faccio un esempio: devo creare una libreria che mi serve a leggere due sensori I2C:

  • Voglio fare tutta una libreria in cui metto tre classi: Calcoli sensore 1, calcoli sensore 2, lettura sensori generica che mi servirà in entrambe le altre classi

  • Voglio includere una libreria dentro a questa (di fatto suddivido le tre classi sopra indicate in tre lib diverse), come faccio? Intendo dire tipo quello che si fa con Wire...la includo, uso il begin e posso usare le sue funzioni ovunque



Spero di essermi spiegato meglio :)

Maurotec

Sicuramente hai dato il massimo per spiegarti, ma non sono riuscito a seguirti.

La Wire, come la Serial sono classi che hanno un costruttore (in C++ il costruttore c'è sempre) e vengono pre-istanziate nel codice di libreria. Se apri Wire.h e Wire.cpp ti accorgi che in all'ultima riga del .cpp, che la creazione di una istanza:
Code: [Select]
TwoWire Wire = TwoWire();

nel .h c'è la dichiarazione di Wire extern:

Code: [Select]
extern TwoWire Wire;

Quest'ultima rende visibile la variabile Wire a tutto il codice che include l'header file Wire.h.

Se tu vuoi fare la stessa cosa prendi esempio da Wire, se non è questo che ti serve, spiega cosa ti serve.
Forse sarebbe più semplice se spiegassi un solo punto per volta e così' ci si concentra su una sola cosa.

Ciao.

mastraa

Beh si diciamo che hai dato soluzione a molti miei dubbi, ora vorrei capire bene cosa vuol dire quel codice, ma ho capito che di fatto fa l'istanza già dentro la libreria e l'Arduino ovviamente la vede come parte di codice integrando tutto assieme.

Solo che in genere l'istanza la si fa tipo

nomeClasse name;
oppure se necessita di parametri nomeClasse name(parametri);

quindi perché abbiamo TwoWire Wire=TwoWire(); cioè a cosa fanno riferimento? Wire sicuramente al 'name' indicato prima, il primo TwoWire sarà il 'nomeClasse', ma il secondo TwoWire?

Il resto me lo sono appena risolto da solo con l'aiuto della Cookbook

grazie mille:)

Maurotec

Quote
Il resto me lo sono appena risolto da solo con l'aiuto della Cookbook


Quale libro? link please (sempre se c'è link).

Argomentare sarebbe lungo e io non ho informazioni fresche su C++.
Non ho idea del perché abbia usato quella sintassi, per me sarebbe bastato TwoWire Wire;
In quel caso si è chiamato in causa il costruttore di copia e non ho indagato se nella classe ne è stato fornito uno
esplicito. Quando ho qualche dubbio, apro QtCreator creo un progetto C++ e sperimento sul PC.

Ciao.

Go Up