come da titolo vorrei capire se è possibile modificare la variabile appartenente a una libreria senza andare a modificare il file xxxxxxxx.h, per evitare ad ogni aggiornamento di ricordarsi di andare a manipolare manualmente la libreria.
Quindi vorrei intervenire da codice, è possibile ?
Forse si, forse no. Dipende da cosa vuoi modificare, chiarisci meglio, indica quel'è la libreria a cui fai riferimento, cosa vuoi modificare e anche il perché hai necessità di modificare tale valore.
Così al buoi è quasi impossibile rispondere
Si ma per esperienza a volte si usano termini non corretti. Tu hai indicato la modifica di una variabile mentre è una define .
La risposta è... SI, vedi che la define della dimensione massima del pacchetto è racchiusa in una direttiva di precompilazione? Questa indica alla libreria di definire MQTT_MAX_PACKET_SIZE paria a 128 se non è già stata definita prima (ifndef = if non defined).
nei tuoi programmi puoi mettere come prima riga prima di importare la libreria
... purtroppo, per come funziona l'IDE e per come riarrangia le cose, NON è detto che sempre funzioni, ovvero, NON è detto che mettendo la tua #define prima della #include, l'IDE, in fase di riorganizzazione del sorgente, rispetti veramente la sequenza ... :
Moce993:
Infatti non funziona... altre strade percorribili esistono ? :
Beh ... o NON usare l'IDE ed usare altri ambienti di sviluppo (... ma richiede una certa esperienza) o ... purtroppo mettere le mani dentro la libreria (... che è la cosa più rapida ed indolore).
Non potrebbe modificare la libreria una volta per tutte facendola andare a prendere il valore di una variabile da lui impostata a piacimento? Dovrebbe cercare MQTT_MAX_PACKET_SIZE e sostituirlo con DIMENSIONE, variabile globale definita nel suo programma. Funzionerebbe?... Oppure aggiungere un parametro quando la chiama.
DOCDOC: Mi sa che come dici tu si avrebbe lo stesso problema dell'ordine non seguito dal compilatore...
Datman:
Non potrebbe modificare la libreria una volta per tutte facendola andare a prendere il valore di una variabile da lui impostata a piacimento?
Mmmm ... potrebbe aggiungere un metodo, che dovrebbe richiamare per prima cosa prima di ogni altra, per passare quel valore oppure, non ho visto come è fatta la libreria, ma se ha un costruttore o un begin() a cui si puô passare un parametro, protebbe forse farlo in quell'occasione ...
... però si perde il fatto che l'OP vorrebbe poter fare la cosa SENZA mettere mani alla libreria
Ah, ho capito. Credevo che non volesse dover modificare la libreria ogni volta che la usa secondo le sue esigenze del caso, invece il discorso è diverso!
Datman:
Ah, ho capito. Credevo che non volesse dover modificare la libreria ogni volta che la usa secondo le sue esigenze del caso, invece il discorso è diverso!
eh già, voglio evitare possibili errori/dimenticanze causate dall'aggiornamento delle librerie, ma a quanto pare con l'IDE di Arduino non è possibile.
gpb01:
Beh ... o NON usare l'IDE ed usare altri ambienti di sviluppo (... ma richiede una certa esperienza) o ...
Potrei provare con Eclipse ma dubito cambi qualcosa visto che il compilatore è sempre lo stesso, coretto ?
Moce993:
Potrei provare con Eclipse ma dubito cambi qualcosa visto che il compilatore è sempre lo stesso, coretto ?
NON è questione di compilatore, ma di IDE che, per semplificare la vita agli utenti, nasconde una serie di cose facendole lui ... non sempre come sarebbe meglio fossero fatte.
Non so Eclipse se si appoggia sempre sul IDE di Arduino o meno ... :
fabpolli:
...con la libreria PJON a me ha sempre funzionato...
sarà forse perché PJON non ha la parte CPP, è solo punto-h
questo mi fa pensare che lo IDE pre-compili i CPP inclusi, prima di "leggere realmente" il programma
ho dato uno sguardo a come si comporta lo IDE, ma secondo me fa cosa strana
ho dato uno sguardo ai file temporanei, e mi sembra proprio dagli orari che crei prima i punto-o compilati dai punto-ccp, e solo dopo il resto
ma ho trovato una incongruenza:
ho usato per prova il mio albaetramonto, fatto qualche tempo fa, mi sono limitato a citare, senza usare, la softserial
ora, se guardiamo i tre file scopriamo una cosa interessante:
lo IDE crea un file "albatramonto.ino.cpp" dove vengono creati ad esempio i prototipi, citata la libreria arduino.h
ma non c'é la main(), e il pre-compilatore non ha ancora lavorato: ci sono ancore le define e le include, li poi si vede benissomo che manca l'espansione della macro X(
in una cartella a parte crea invece: "ctags_target_for_gcc_minus_e.cpp" che credevo fosse l'esito del pre-compilatore, e invece no:
le macro sono espanse, anche la macro X(
ma non c'é traccia della main() ne delle definizione che ci dovrebbero essere nei vari punto-h
non ci sono nemmeno i prototipi, quindi non è la fase successiva alla creazione dei prototipi da parte dello IDE
quindi esiste ancora un "livello" tra IDE -> Pre-compilatore -> compilatore, livello che non vediamo (o almeno io ho perso di vista)
... il main() fa parte del "core" e si trova nel modulo main.cpp :
#include <Arduino.h>
// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }
// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
... è lui che chiama prima la setup() e poi, in una "for" infinita, il loop() e, se definita dall'utente (quella di base è una (weak) vuota), la serialEventRun()
quindi in realtà il programma principale è questo
il file "xxx.ino.o" verrà linkato dentro li...
ma all'ora loop() e setup() dovrebbero essere dichiarate extern.....
altrimenti non compilerebbe, boh, forse sbaglio
comunque ho appena messo a punto un trucco per fare quello che si vuole fare
è un po' sporco, ma permette di rispettare le due prescrizioni originali:
non alterare la libreria, per poter usufruire degli aggiornamenti
cambiare nel sorgente del programma il valore con una #define
quello che non si può fare è variare a run-time questo valore
essendo dato con una define (risolta a compile-time) non è possibile cambiarlo durante l'esecuzione
naturalmente c'é uno "sporco trucco"
però, stabiliamo: se funziona e sodddisfa le specifiche non è ne sporco ne trucco
all'ora, visto che nei tempi passati ho avuto occasione ampiamente di scornarmi con persone che fanno del "language nazi" più di me, e che poi fanno assegnazioni inutili di macro eccedenti su test ridondanti....
non sono disposto a mettere in discussione questa tecnica
voglio esplicita assicurazione che che le due o tre persone che in passato mi hanno martellato perché usavo le stringhe "A my manera" o il passaggio di puntatori a costante o simili "acrobazie" che saranno anche "molto sporco trucco" ma ottengono il loro "sporco risultato"
ecco, queste persone non mi "stresseranno l'anima"