Oppure

Loading
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! :rotfl:
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 buontamponi non implica necessariamente mancare di serietà. :heehee:
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 16:16
Mikelius
Postato originariamente da AldoBaldo:
...


Il discorso delle maiuscole\minuscole
Le versioni che avevo fatto erano solo per il codice ASCII, avevo usato toupper() e tolower(), quindi dove andavano bene loro andavano bene pure le mie.

Per le lettere accentate, seguendo sempre la tabella ASCII Estesa, le convertivo nei corispondenti senza accento.

Mascherare la frase, si XD l'avevo fatta per il gioco dell'impiccato, ma può essere vista come un caso particolare della tua
char *sostituisci_caratteri(     const char *str, const char *orig, const char *sost ); 


Sostituisce tutti i caratteri con uno scelto. Utile? dipende il programma che serve creare. Sicuramente la meno utile del mucchio.

Giustamente, per la funzione delle doppie, è più logico farlo con un carattere a scelta (avevo scritto spazi ma in generale ho sempre cercato di fare le funzioni più generiche che potevo,P.S. la funzione conviene reiterativa, in modo da cancellare anche sequenze di 3 o più caratteri uguali)
Avevo anche tentato di scrivere una funzione che convertisse i TAB in 4 spazi, ma c'era il problema che si verebbero a creare 3 caratteri in più, quindi la stringa dovrebbe essere "aumentata"


Postato originariamente da TheDarkJuster:

Esiste STD::string che fa una cosa simile. Non sento la necessità di riproporlo in c.


Nulla da ridire, ma per chi usa il C?
E' veramente "lavoro e tempo perso" cercare di ricreare qualcosa di simile?
e' una domanda tecnica.
A tuo avviso, dovendo usare il linguaggio C, il gioco vale la candela?
Fermo restando che ci sia la possibilità di usare STD::string nel linguaggio C, cosa che sconosco.
aaa
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