Arduino Forum

International => Italiano => Software => Topic started by: gpb01 on Jun 14, 2020, 03:38 pm

Title: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 14, 2020, 03:38 pm
Più volte, su questo forum, abbiamo sconsigliato la classe "String" per i vari problemi che essa provoca.

Il commento di "SparkFun" sulla classe "String" è, più o meno, il segunete: "la classe String (con 'S' maiuscola) in Arduino utilizza una grande quantità di memoria e tende a causare svariati problemi su progetti si una certa dimensione. tale clsasse dovrebbe essere fortemente evitata nella scrittura di librerie".

Similmente "Adafruit" all'incirca così commenta: "Nella maggior parte degli utilizzi, molti altri piccoli oggetti String vengono temporaneamente utilizzati forzando la nuova allocazione delle stringhe in una nuova area dell'heap e lasciando un grosso buco dove si trovava quello precedente (frammentazione della memoria)."

Noi stessi abbiamo più volte segnalato agli utenti che utilizzavano la classe "String": "NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String (http://arduino.cc/en/Reference/StringObject)", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!"

Sempre "Adafruit" da una chiara rappresentazione grafica del problema ...

(https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/learn_arduino_Stack_Operation.gif)


... e suggersice, come alemno primo palliativo per evitare il crash, quello di usare il metodo String.reserve () che, se impedisce la frammentazione dell'heap, non fa nulla e non riduce l'utilizzo eccessivo della memoria.
Inoltre, anche se si evita la frammentazione del "heap", la continua creazione di oggetti "String" e la copia di stringhe all'interno di essi (e tra di loro), è cosa estremamente lenta.

Continua ....
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 14, 2020, 03:53 pm
Il suggerimento, sempre da noi dato agli utenti che utlizzavano la classe "String" è stato: "Impara ad usare le stringhe (http://arduino.cc/en/Reference/String) classiche del C ... ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc (http://www.nongnu.org/avr-libc/user-manual/modules.html) ed, in particolare, quanto è in <string.h> (http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html) ".

Sicuramente, se questa è la strada migliore, certamente NON è la più semplice, almeno per "i meno esperti", che espone il programma al grosso rischio di "corruzione" della memoria se ... l'utente sbaglia il dimensionamneto dei char array o se copia stringhe classiche in altre strighe classiche magari di dimensioni più piccole o se fa comunque operazioni sugli array usando un indice fuori del valore massimo, ecc. ecc. ... tutte cose che, ribadisco "i meno esperti", rischiano facilmente di fare.

In aiuto a tali "meno esperti" c'è oggi una nuova libreria, installabile dal "library manager" che è una valida alternativa alla classe "String" pur mantenendone tutte le semplificazioni ed è la "SafeString (https://github.com/PowerBroker2/SafeString)" ;D

La libreria "SafeString" è stata progettata dall'autore (tale Matthew Ford) per "i principianti" come sostituto sicuro, robusto e debuggable perl'utilizzo delle stringhe in Arduino!

La guida completa all'installazione (da library manager) ed all'uso di detta libreria, si trova QUI (https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html) ... ne consiglio una attenta lettura.

Se ne è parlato anche parecchio nel gruppo di Google dedicato agli "sviluppatori di Arduinio", QUI (https://groups.google.com/a/arduino.cc/forum/#!topic/developers/709sDH6iJkQ), è la discussione ancora va avanti :)

SafeString è sicuramente una valida alternativa alla classe "String", offre le stesse facilitazioni, ma è estremamente sicura, evita i guai della "String" ed è ben manutenuta ... consiglio di provarla !  :smiley-mr-green:

Fatemi sapere ... ;)

Guglielmo

P.S.: io comunque continuo ad usare le funzioni classiche che si trovano in <string.h> ... ormai ho l'abitudine :D
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: Standardoil on Jun 15, 2020, 06:59 pm
non so, non sono convinto...
non metto in dubbio la "sicurezza" della classe, che guarderò con calma

la questione è che così facendo ci si allontana dallo spirito del C

ho visto (e temo che con questa classe ne vedremo tanti altri) gente che usa una String solo per non fare due print in successione, manco gli viene in mente di farlo

e mettergli una ulteriore "stampella" non sono sicuro che gli insegni a "camminare"


EDIT
Ho dato una rapida occhiata a quella classe:  ma si basa sulla pre-dichiarazione della dimensione massima dell'oggetto?
e quindi dove sarebbe il suo vantaggio competitivo rispetto alla pre-esistente Pstring?
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 15, 2020, 07:10 pm
e mettergli una ulteriore "stampella" non sono sicuro che gli insegni a "camminare"
Sicuramente, difatti per primo dico che la cosa migliore sarebbe imparare ad usare bene le funzioni di <string.h>, ma ...l'esperienza ormai ci insegna che, per una buona fetta di utenza, sono cose già troppo complicate che la classe "String" gli semplifica ... ecco, questa fornisce la stessa semplicità, con tutte le stesse facilitazioni (concatenazioni, confronti, ricerca di token, e tutto quello che è possibile fare con "String") nascondendogli l'uso delle funzioni di <string.h> che in realtà usa.

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 15, 2020, 07:21 pm
Ah ... dimenticavo, se hai obiezioni, critiche, suggerimenti, domande e quant'altro ... ti prego di andare nell'apposito gruppo di "Arduino (https://groups.google.com/a/arduino.cc/forum/#!topic/developers/709sDH6iJkQ)" e esponi il tutto li. :)

Questo thread è SOLO per informare l'utenza sull'esistenza di un'alternativa e per cercare si aiutare (nei limiti del possibile) chi avesse difficoltà nel suo uso, NON per discussioni sulla libreria stessa ... dato che l'autore NON fa neanche parte del forum e NON ci legge. ::)

Grazie.

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: docdoc on Jun 16, 2020, 10:21 am
Grazie Guglielmo, ottima cosa!

Anche se sono anche io della "vecchia scuola" (ossia ho imparato prima il C, e solo dopo sono arrivati C++ et similia) per cui credo che userò comunque sempre il modo classico, potrebbe essere sicuramente utile non solo per i meno esperti di programmazione in generale, ma anche per chi proviene da ambienti come Java o C# i quali hanno l'abitudine a quella classe di oggetti più "facili da maneggiare".

PS: non capisco perché, ma all'autore non interessa stare anche in questo che è il forum ufficiale di Arduino?? Boh..
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: docdoc on Jun 17, 2020, 12:08 pm
Update: ho dato un'occhiata, ed in parte sono rimasto un poco deluso. La programmazione ad oggetti non avrebbe permesso di fare override della classe String, o anche crearne una apposita, analoga?

Magari alla prima occasione di provare ad usarla mi analizzerò meglio i sorgenti della SafeString e vista dall'interno forse mi dovrò ricredere, però, per dire, non capisco perché iniziare con dichiarazioni che attualmente sono del tipo:

createSafeString(stringOne, 35);

invece di quello che mi aspettavo di vedere, ossia o questo:

String stringOne(35);

oppure:

SafeString stringOne(35);

Insomma, si, tutto bello, bella la boiserie, ma non è che mi convinca appieno...

PS: si, so che c'è il Google Group dove ne parla anche lo stesso autore, ma intanto mi interessa l'opinione della "nostra" comunità che già conosco... ;)

PS2: Tra l'altro la libreria contenuta in uno spazio GitHub che non è gestito dall'autore ma da uno (?) che semplicemente gli "presta" lo spazio è un'altra cosa che non concepisco...
Ossia mi chiedo: "perché"? Lasciamo stare il fatto (anomalo) che uno che sviluppa una libreria per Arduino ma non frequenta il forum ufficiale di Arduino, mi chiedo perché non abbia voglia di usare gli strumenti comuni che usano milioni di sviluppatori, e quindi gestire da sé la sua libreria (incluse le pagine su GitHub come versioni, request, wiki, eccetera). E' timido? E' pigro? E' straniero?
Boh...
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 17, 2020, 12:39 pm
Eh NO, è giusto che sia fatta come è fatta, proprio per NON usare in alcun modo la classe String e distinguersi da essa.

Considera che, se hai letto il gruppo, aveva chiesto di rimpiazzare la String con la SafeString, ma ... pare che la String NON si tocca e quindi ... nomi diversi dato che ciascuna deve restare indipendete dall'altra.

Per il resto, ripeto, "De gustibus non est disputandum" ... :)

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: Standardoil on Jun 17, 2020, 12:47 pm
Considera che, se hai letto il gruppo, aveva chiesto di rimpiazzare la String con la SafeString, ma ... pare che la String NON si tocca e quindi ... nomi diversi dato che ciascuna deve restare indipendete dall'altra.


Guglielmo
Beh   
Vorrei vedere

La classe String fa parte della libreria standard del linguaggio, non è che la si cambia facile...
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: docdoc on Jun 17, 2020, 12:55 pm
Eh NO, è giusto che sia fatta come è fatta, proprio per NON usare in alcun modo la classe String e distinguersi da essa.
Ma non si "usa" la classe String se fa override, e neanche si modifica la String ma semplicemente la "sua" classe facendo override sulla String, "nasconde" le corrispondenti funzioni, e solo per i progetti dove questa viene usata.
(voglio sperare che il core di Arduino internamente non usi le String... ;) )

Quote
Considera che, se hai letto il gruppo, aveva chiesto di rimpiazzare la String con la SafeString, ma ... pare che la String NON si tocca e quindi ... nomi diversi dato che ciascuna deve restare indipendete dall'altra.
Si, ma in ogni caso per me la soluzione migliore e più "pulita" era appunto di definire una classe "SafeString" ma rendendola visibile direttamente, e non tramite i "giochini" come mi pare faccia in quella libreria, e che costringono a fare dichiarazioni di variabili in quel modo "rozzo" :D

Vorrei vedere
La classe String fa parte della libreria standard del linguaggio, non è che la si cambia facile...
Ma chi ha parlato di cambiare la classe String della libreria? Fare una classe che la eredita e ne fa override delle parti che vanno cambiate per gestire diversamente l'allocazione non è "cambiare" nulla.
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 17, 2020, 01:28 pm
La classe String fa parte della libreria standard del linguaggio, non è che la si cambia facile...
... in realtà, se andate a leggere, vedrete che era stato chiesto proprio di "riscrivere" la classe String seguendo quanto fatto nella SafeString  ;D  ... la richesta è stata declinata ...

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: maubarzi on Jun 17, 2020, 03:42 pm
La dichiarazione, da quel che scrivi, semplicemente mi pare segua l'implementazione del creational design pattern.
Disaccoppia la chiamata di creazione dall'oggetto creato.
Il metodo da te preferito è il costruttore dell'oggetto.
Entrambe le vie sono usate correntemente a seconda dei casi e a volte dei gusti, non ci vedo nulla di così strano o esotico.

Riguardo implementare una cosa nuova come override di una vecchia, la trovo, sinceramente, una porchieria.
Tanto vale fare la classe da zero, come scrivi sotto, e implementare una interfaccia simile senza però nessun vincolo, cioè senza l'uso di una vera interfaccia, ma giusto per mantenere la familiarità in chi la utilizza.

Per il resto, io avrei debellato sia String che evitato questa implementazione, creando un po' di cultura sull'uso delle stringe C standard.
A volte, si crede di semplificare la vita creando questi oggetti ma secondo me si semplificherebbe di più se non ci fossero, così la gente sarebbe costretta a imparare nel modo giusto fin da subito senza vedere delle false panacee.
Occhio non vede cuore non duole.
Parlo solo di Arduino ed MCU dove c'è il rischio concreto di frammentazione della memoria a causa di queste classi.
E ve lo dico io che al C mi ci sono avvicinato solo con Arduino e quindi abituato da sempre ad usare la classe String in altri linguaggi.
Qui, non ne sento minimamente la mancanza.
Anzi, a volte mi riscrivo anche funzioni io perchè quelle già pronte richiedono troppe risorse, es. sprintf, quindi usare gli array di char, a maggior ragione, non mi cambia la vita.

Maurizio
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: nid69ita on Jun 17, 2020, 03:56 pm
... non capisco perché iniziare con dichiarazioni che attualmente sono del tipo:
createSafeString(stringOne, 35);
oppure:
SafeString stringOne(35);
Insomma, si, tutto bello, bella la boiserie, ma non è che mi convinca appieno...
Non capisco @docdoc, quella libreria usa un truccaccio (come hai scritto poi) con una macro per dichiarare un buffer fuori dalla dichiarazione dell'oggetto.     
Nella pagina github specifica che questo
  createSafeString(str, 40);
viene "espanso" in
  char str_SAFEBUFFER[40+1];
  SafeString str(sizeof(str_SAFEBUFFER),str_SAFEBUFFER,"","str");

Per me è un pò un accrocchio. Viola le regole di buona programmazione a oggetti.
Se non ricordo male esiste anche una libreria (forse tu @docdoc l'avevi segnalata) PString3 (http://arduiniana.org/libraries/pstring/)  dove a cura del programmatore dichiarare a priori un buffer, cosa che questa lib fa con trucchetto della macro.

Però, in tutti casi abbiamo un array di dimensione fissa, non di certo la facilità d'uso (ma con i problemi di micro-frammentazione memoria) di una allocazione dinamica. Non capisco quanto possa aiutare un utente alla prime armi. Rimango scettico.
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: maubarzi on Jun 17, 2020, 04:49 pm
Ok, mi rimangio quanto scritto sopra sul costruttore, un trucco e bistrucco non è certo un design pattern, e mi confermi ulteriormente la mia idea iniziale, che tanto vale usare gli array di char e debellare il resto.

Maurizio
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jun 17, 2020, 07:29 pm
... Non capisco quanto possa aiutare un utente alla prime armi. Rimango scettico.
... aiuta nel senso che l'utente "alle prime armi" è abituato ad usare i metodi "semplici" della classe String ... questa glie li fornisce senza usare le String e nascondendogli la complessità delle funzioni di <string.h> ... PUNTO.

Nessun utente "alle prime armi" va a vedere come è fatta dentro, la usa e basta, quindi lo aiuta ad evitare i casini della classe String pur mantenendo la ... semplicità d'uso.

Detto questo ribadisco quanto detto al post #4 (https://forum.arduino.cc/index.php?topic=690342.msg4643306#msg4643306) ... quindi, andate a discutere della bontà o meno di essa nel gruppo di "Google" degli sviluppatori Arduino ... altri "commenti" sulla libreria verranno cancellati.

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: docdoc on Jun 17, 2020, 07:45 pm
tanto vale usare gli array di char e debellare il resto.
Concordo, e se è per questo io non avrei proprio implementato la String sotto Arduino.
IMHO uno che vuole programmare microcontrollori non dico che debba saper programmare in Assembler, ma il C è fondamentale che lo conosca per restare più possibile "a basso livello" con l'hardware, per questioni sia di conoscenza di ciò che si sta gestendo, sia per maggiore controllo dell'efficienza del codice.
Ma se anche fosse, mi vanno ad implementare una classe che fa uno spreco di risorse proprio su una MCU con pochissima RAM? Ok, implementala ma fallo "decentemente" (intendo entro i limiti dell'hardware ovviamente), ed un esempio è proprio questo SafeString che "maschera" la gestione classica C per gestire le stringhe "quasi" come su sistemi più evoluti, ma di fatto ad uso esclusivo degli utenti "abituati" a linguaggi e sistemi di livello più alto.

... in realtà, se andate a leggere, vedrete che era stato chiesto proprio di "riscrivere" la classe String seguendo quanto fatto nella SafeString  ;D  ... la richesta è stata declinata ...
Uh, non me lo spiego, ma ok, no comment...
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gianlucaf on Jul 22, 2020, 08:54 am
Farò sicuramente una prova.
Devo ammettere che per pigrizia non ho più modificato il mio programma come mi aveva intimato di fare Guglielmo. :D
A mia discolpa c'è da dire che uso le stringhe in lettura quindi non c'è un consumo costante di memoria e non mi ha mai dato problemi.

Qualcuno ha provato a scrivere uno sketch consuma memoria con entrambe le librerie e vedere cosa succede?
Una curiosità, le stesse raccomandazioni valgono anche per altre MCU, tipo una a caso, ESP32?
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: nid69ita on Aug 14, 2020, 10:25 am
Qualcuno ha provato a scrivere uno sketch consuma memoria con entrambe le librerie e vedere cosa succede?
Una curiosità, le stesse raccomandazioni valgono anche per altre MCU, tipo una a caso, ESP32?
Cioè NON usare String, ?    Assolutamente si.   Su ESP32 hai solo più memoria SRAM, quindi la microframmentazione potrebbe insorgere dopo più tempo, ma  i problemi intrinseci rimangono.    Non hai un S.O. che fa pulizia/compattazione della memoria
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: cotestatnt on Oct 25, 2020, 10:35 am
Cioè NON usare String, ?    Assolutamente si.   Su ESP32 hai solo più memoria SRAM, quindi la microframmentazione potrebbe insorgere dopo più tempo, ma  i problemi intrinseci rimangono.    Non hai un S.O. che fa pulizia/compattazione della memoria
Non è del tutto corretta la tua affermazione. 
La gestione della memoria RAM su ESP32 è completamente diversa da quella degli Arduino AVR.
Inoltre viene usato il kernel FreeRTOS che offre un minimo di gestione della memoria più avanzata (http://https://www.freertos.org/a00111.html (http://https://www.freertos.org/a00111.html)).
Ciò detto, tendenzialmente anche io evito di usare il più possibile la classe String, ma ci sono alcune situazioni in cui alla fine si rivela la scelta migliore e tutto dipende da come la usi. Ad esempio, se vuoi sviluppare una libreria per Arduino, dove la classe String è stra-usata soprattutto negli esempi, "constringere" l'utente neofita ad usare metodi più memory safe può essere complesso e controproducente (la maggior parte delle persone al primo segno di difficoltà passa oltre).
Ecco allora che una bella funzione in overload può salvare capra e cavoli.
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: maubarzi on Oct 25, 2020, 02:38 pm
...
Ciò detto, tendenzialmente anche io evito di usare il più possibile la classe String, ma ci sono alcune situazioni in cui alla fine si rivela la scelta migliore e tutto dipende da come la usi. Ad esempio, se vuoi sviluppare una libreria per Arduino, dove la classe String è stra-usata soprattutto negli esempi, "constringere" l'utente neofita ad usare metodi più memory safe può essere complesso e controproducente (la maggior parte delle persone al primo segno di difficoltà passa oltre).
Io non sono d'accordo.
Una strada semplice ma sbagliata, porta solo a problemi, fa si che le persone si adagino e si abituino sempre alle cose semplici innescando un circolo vizioso verso il peggio.
Le persone sono in grado di imparare ogni cosa, quando gli serve, se però gli affianchi una cosa facile, li rendi pigri e non si impegneranno mai a studiare perchè a prima vista non gli pare sensato e quando si accorgono che la strada facile è sbagliata, ormai è troppo tardi. Invece di ripartire nel modo corretto cercano accrocchi di ogni tipo pur di non cambiare, perchè a questo punto vuol dire dover rimettere mano a troppe cose.
Lo vedo di continuo.
E vedo che cose difficili, senza scorciatoie, vengono assimilate senza problemi se adeguatamente spiegate ma soprattutto senza che ci siano strade apparentemente più facili e consuete.

Maurizio
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: cotestatnt on Oct 25, 2020, 06:11 pm
Maurizio il tuo discorso non fa una piega e lo trovo del tutto condivisibile.
Il fatto è che io non ritengo a priori "una strada sbagliata" usare la classe String, mentre lo è di sicuro usarla male.

E' come se io dicessi a qualcuno che il saldatore non te lo faccio usare perché è pericoloso.
Non è meglio insegnare ad usare qualcosa facendo le dovute raccomandazioni sui rischi che si possono incontrare e su come evitarli?
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: Standardoil on Oct 25, 2020, 06:33 pm
il socio si è dimostrato di nuovo mio "fratello di quaderno a quadretti", il suo ultimo intervento potrei averlo scritto io,

comunque usare la classe String senza un sistema operativo è la versione informatica della roulette russa

non è 'possibile' che succedano casini: è "sicuro"

l'unica parte incerta è "quando" succederanno

e non cominciamo con le storie che basta dichiarare l'oggetto String locale perchè le cose tornino a posto quando l'oggetto stesso "decade" alla fine della funzione

chi dice che sia vero? la classe string usa la gestione dinamica della memoria, tutte le considerazioni sul "tempo di vita" delle variabili sono aria fritta

e comunque, un programmatore che è in grado di fare di queste sottigliezze conosce abbastanza della programmazione per NON usare la classe String, e quindi mi fa, a me personalmente, il favore di non farlo con arduino, altrmenti lo metto nel nel cerchio Settimo, Terzo girone dell'Inferno: Bestemmiatori e 'String'oisti

Prima legge di Nelson (che sono io): fare cappelle solo perché non si vuole imparare a lavorare bene ti declassa agli occhi di chi invece bene ci lavora
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Oct 25, 2020, 06:34 pm
... Il fatto è che io non ritengo a priori "una strada sbagliata" usare la classe String, mentre lo è di sicuro usarla male. ...
... il fatto è che la maggior parte di quelli che qui arrivano (oltre il 90%) sono utenti di MCU AVR, spessissimo di piccolo taglio ... ATmega328P e ... con soli 2 KB di SRAM, mettila come vuoi ... alla fine vai nei casini, quindi ... meglio prevenire e dirgli di non usarla (poi, se mai un giorno andranno a programmare su qualche cosa di più completo, magari con un OS che gestisce la memoria, allora vedranno che le cose cambiano ;)).

Guglielmo

PS: mi sono sovrapposto al post di Standardoil ... :D
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: maubarzi on Oct 25, 2020, 10:04 pm
Continuo a non essere d'accordo.

E' come se io dicessi a qualcuno che il saldatore non te lo faccio usare perché è pericoloso.
In realtà, per fare un paragone corretto, si dovrebbe considerare un saldatore che dopo un certo tempo, dipendente dal lavoro che se ne deve fare, fa saldature fredde (cioè talmente bacate da non far contatto).
Ok, normalmente lo fa dopo ore, quindi se lo usi per piccoli lavoretti non incappi nel problema, ma perchè usare questo saldatore se con un piccolo costo aggiuntivo ne puoi avere uno che non avrà mai problemi?

Ecco, questo sarebbe un paragone un po' più calzante.

Una classe che frammenta la memoria, non può essere usata bene o male. Se la usi ti tiri dietro il suo problema se non la usi no.

La questione è tutta qui.
Poi, tutti i linguaggi di alto livello usano una implementazione della classe String, ma li è tutta un'altra storia, c'è un gestore che si occupa di tenere la memoria in ordine e non si hanno risorse così limitate.

Personalmente ritengo che chi scrive librerie per Arduino usando la classe String, non pensa che le sue librerie possano venire usate in progetti che devono girare per molto tempo.
Altrimenti non userebbero certe bombe ad orologeria.

Poi, ognuno è libero di farsi del male come meglio crede, ma ritengo che sia un approccio culturalmente sbagliato.

Maurizio

P.S.
il socio si è dimostrato di nuovo mio "fratello di quaderno a quadretti", il suo ultimo intervento potrei averlo scritto io,
Socio, lo ammetto, ho copiato  ;D
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: cotestatnt on Oct 26, 2020, 04:49 pm
Ragazzi io non voglio insistere più di tanto, però qui mi sembra che ci sia un po' di talebanesimo nei confronti di questa povera classe quindi vedo di finirla prima di essere passato a fil di Kalashnikov (sto scherzando eh ;) ;)).
Voi dite che frammenta la memoria a prescindere, io dico dipende e che sicuramente ci sono "pratiche da neofita" molto più dannose dell'utilizzo di String (abuso del delay, convertire 2/3 volte la stessa informazione, utilizzo eccessivo di variabili globali etc etc).

P.S.
Volevo solo aggiungere che io ho realizzato dei progetti dove se ne fa un uso appropriato (a mio modo di vedere) che girano H24 senza il minimo problema ormai da anni, sia su MCU Espressif, ma anche e soprattutto su dei "miseri" ATMega328.
A mio avviso, se un firmware crea problemi, la colpa non è del saldatore ma di chi lo usa.
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: maubarzi on Oct 26, 2020, 05:18 pm
Io non ho intenzione di passare nessun a fil di spada, per cui tranquillo.
Però il paragone con il saldatore, purtroppo non calza, perchè con il saldatore è ovvio che la colpa è sempre di chi lo usa...
Per il resto, quel che c'era da dire è stato detto sia da parte tua che da parte mia, per cui, non serve continuare ripetendo le stesse cose  ;)

Maurizio
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: nid69ita on Oct 26, 2020, 06:12 pm
e non cominciamo con le storie che basta dichiarare l'oggetto String locale perchè le cose tornino a posto quando l'oggetto stesso "decade" alla fine della funzione
Chi lo dice prende un abbaglio grosso.
Quando un oggetto String viene dichiarato locale, l'oggetto è in memoria stack. Ma la classe String usa internamente malloc,free,realloc,  quindi prende spazio in Heap, che l'oggetto sia locale o globale.   Ovvero il suo membro puntatore a char buffer sempre punta a qualcosa in heap. Ed è quella che si frammenta.

Ragazzi io non voglio insistere più di tanto, però qui mi sembra che ci sia un po' di talebanesimo nei confronti di questa povera classe quindi vedo di finirla prima di essere passato a fil di Kalashnikov (sto scherzando eh ;) ;)).
Voi dite che frammenta la memoria a prescindere, 
Non a prescindere, è facile però avere un uso che frammenta la memoria. E l'utente medio non lo sa/capisce.
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Oct 26, 2020, 06:21 pm
Vorrei rammentare a tutti un mio post della pagina precedente ...

...
Questo thread è SOLO per informare l'utenza sull'esistenza di un'alternativa e per cercare si aiutare (nei limiti del possibile) chi avesse difficoltà nel suo uso .......
... quindi, magari ora finiamola qui con questa lunga (... se pur interessante) discussione. Grazie ;)

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: drmpf on Nov 12, 2020, 07:09 am
SafeString V2 is now out. See the  updated tutorial  (https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html)

V2 adds wrapping of char * and char [] in SafeStrings for safe processing that updates the original c-string directly.  
(please excuse my lack of Italian)
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Nov 12, 2020, 09:19 am
>drmpf: Hi, thanks a lot for the info ! :)


Quote
E' disponibile l'aggiornamento alla V2 di SafeString V2. QUI (https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html) il tutorial aggiornato.

La V2 aggiunge il wrapping di "char *" e "char []" in SafeStrings per trattamento corretto e sicuro che aggiorna direttamente la c-string originale.
Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: zoomx on Nov 30, 2020, 08:16 am
Karma+
thank you very much for the update!
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: drmpf on Dec 19, 2020, 03:33 am
V2.0.6 of the SafeString library includes a replacement for Arduino Serial Text I / O that works in real world applications. 
 A detailed tutorial is here  (https://www.forward.com.au/pfod/ArduinoProgramming/Serial_IO/index.html)

Arduino Serial is not suitable for handling Text I / O in Real World applications.  

See the tutorial for the details (https://www.forward.com.au/pfod/ArduinoProgramming/Serial_IO/index.html) 
or this forum post for a summary (https://forum.arduino.cc/index.php?topic=718953.0)
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Dec 19, 2020, 08:48 am
Thanks a lot for the info !  (http://www.nikonland.eu/forum/public/style_emoticons/default/ibf_thumbup.gif)

Guglielmo
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: zoomx on Dec 20, 2020, 07:56 pm
Another Karma+!!!
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: drmpf on Jan 06, 2021, 06:43 am
SafeString V3 has been released.
It adds SafeStringReader a non-blocking replacement for Serial.readString (), with optional echo and non-blocking timeout
BufferedInput for when 64bytes is just not enough
SafeStringStream provides a means to stress test sketches the use Text I / O

The Text I / O for the Real World (https://www.forward.com.au/pfod/ArduinoProgramming/Serial_IO/index.html) has been fully revised.

The Quick start is: -

 (https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/SafeString.zip)
Title: Re: Classe "SafeString" una valida alternativa alla pessima "String" ...
Post by: gpb01 on Jan 06, 2021, 10:33 am
Still thanks for the info !!! :)

Guglielmo