Oppure

Loading
02/09/18 11:04
comtel
Perdonatemi se riapro la discussione con questa ulteriore domanda, ma con quella soluzione proposta non si evitano gli spostamenti di memoria eccessivi. Del tipo che andiamo a sostituire le occorrenze sella sottostringa nella stringa principale, e poi quando si va a compattare la stringa principale, la andiamo a compattare passo passo, cosi che l'ultima porzione di memoria verrà spostata N volte quante sono le occorrenze trovate. Correggetemi se sto sbagliando.
aaa
02/09/18 23:01
AldoBaldo
Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore 'Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore '{parsed_message}'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).

Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli '{parsed_message}' "segnaposizione" non sposta memoria, però assegna '{parsed_message}' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

|a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
|0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
|S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
                                                // '{parsed_message}' nella XVI posizione


L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...
'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).

Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli 'Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore '{parsed_message}'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).

Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli '{parsed_message}' "segnaposizione" non sposta memoria, però assegna '{parsed_message}' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

|a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
|0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
|S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
                                                // '{parsed_message}' nella XVI posizione


L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...
' "segnaposizione" non sposta memoria, però assegna 'Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore '{parsed_message}'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).

Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli '{parsed_message}' "segnaposizione" non sposta memoria, però assegna '{parsed_message}' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

|a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
|0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
|S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
                                                // '{parsed_message}' nella XVI posizione


L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...
' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

|a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
|0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
|S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
                                                // 'Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore '{parsed_message}'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).


Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli '{parsed_message}' "segnaposizione" non sposta memoria, però assegna '{parsed_message}' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

|a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
|0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
|S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
|s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
                                                // '{parsed_message}' nella XVI posizione


L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...
' nella XVI posizione


L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...
Ultima modifica effettuata da AldoBaldo 02/09/18 23:02
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.
02/09/18 23:22
AldoBaldo
Qui si legge molto meglio: tinyurl.com/…
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.
03/09/18 17:49
comtel
Postato originariamente da AldoBaldo:

Qui si legge molto meglio: tinyurl.com/…


Ti ringrazio veramente per le risposte e per l'aiuto che mi stai fornendo, ho capito il tuo ragionamento.
aaa