21/05/17 13:55
AldoBaldo
Seguendo le osservazioni che mi fate, ecco un paio di versioni "mestruali" della funzione deallocatrice:
void libera_tampone( char **tampone ) {
// sfrutta 'sta storia del corto circuito
if( tampone && *tampone ) { free(*tampone); *tampone=NULL; }
}
void libera_tampone( char **tampone ) {
// NON sfrutta 'sta storia del corto circuito
if( tampone ) { free(*tampone); *tampone=NULL; }
}
Morte all'invasività dellinglese!
Ultima modifica effettuata da AldoBaldo 21/05/17 13:57
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
21/05/17 13:56
Scusate ma tampone al posto di buffer non si può leggere ... siamo seri... Va benissimo free_buffer
Ultima modifica effettuata da 21/05/17 13:57
21/05/17 14:11
AldoBaldo
...e se per "inglobare" l'annullamento del puntatore su una sola riga usassi questo?
#define LIBERA_TAMPONE(p) free(p); (p)=NULL
In questo caso non ci sarebbe doppia indirezione e neppure la creazione di una funzione che a quanto pare è superflua. Ora qualcuno mi dirà "sì, e come la metti col controllo del tipo?". Pignolo.
P.S. A me invece 'sta storia del tampone piace parecchio! E' ironicamente buffa, e un po' di leggerezza ci sta sempre bene. Essere dei buont
amponi non implica necessariamente mancare di serietà.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
21/05/17 14:17
AldoBaldo
Lumo, alla soluzione di una funzione ausiliaria che si prendesse cura di tutte le funzioni di inserimento e sostituzione ci avevo effettivamente pensato. Il problema che non sono riuscito ad aggirare riguarda le dimensioni dell'allocazione, da conoscere preventivamente: per conoscere quelle dimensioni occorrerebbe comunque scorrere le stringhe in input, quindi il vantaggio andrebbe perso. Per procedere invece senza precalcolare quelle dimensioni si finirebbe in un dedalo di allocazioni, deallocazioni e copiature che, penso, sarebbero insensate e "perditempo".
===
Le cosiddette "stringhe Pascal" erano usatissime nel System fino al 9 di Apple, con la limitazione (ovvia) di avere una lunghezza massima di 255 caratteri. Apple, per avere 255 caratteri a disposizione, impiegava stringhe di unsigned char. Ti dirò, entro quel limite erano pure comode!
Pensi che sarebbe agevole replicare un modello simile utilizzando, che so, i primi 4 byte della stringa come fossero un valore size_t? (permetterebbe stringhe di lunghezza oltre il limite dell'utilizzabile... penso ai classici 0xFFFFFFFF caratteri: una stringa invero lunghetta.) In definitiva si tratterebbe di qualche casting e di una lettura con un offset fisso rispetto al puntatore... a quel punto, però, usare le funzioni standard che implicano modifiche dirette della stringa sarebbe quanto mai macchinoso, visto che il valore della lunghezza andrebbe ogni volta aggiornato.
Il discorso non cambierebbe un gran che se invece si usasse una struttura dati comprendente un size_t e il puntatore vero e proprio. Forse sarebbe solo un po' più lineare.
Ultima modifica effettuata da AldoBaldo 21/05/17 14:27
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
21/05/17 15:31
TheDarkJuster
Esiste STD::string che fa una cosa simile. Non sento la necessità di riproporlo in c.
aaa
21/05/17 15:41
AldoBaldo
In effetti STD::string fa MOLTO di più (e, voglio sperare, molto meglio). Del resto, basta pensare a chi è che mette le mani su una cosa come STD::string e chi è che mette le mani sul codice da autodidatta amatoriale che vi propongo di quando in quando. Non pretendo certo di sostituirmi a un mostro sacro come STL et similia!!!
Vedila così: ci sono un sacco di dilettanti che fanno musica orecchiabile e godibile... e c'è Igor Stravinsky con la sua Sagra della primavera. Stravinsky non dovrebbe escludere gli altri, perché sono su piani completamente diversi, con finalità diverse.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
21/05/17 18:56
TheDarkJuster
Si può riproporre STD::string come struttura. In questo modo puoi manipolare la stringa con le funzioni standard e per quelle speciali avvantaggiarti della struttura.
A mio avviso avere una cosa simile a STD::string in c dipende dall'uso che se ne fa delle stringhe. Per un programma in un microcontrollore è controproducente, in qualche programma PC può avere senso se le stringhe sono molto ampie
aaa