Oppure

Loading
16/08/16 14:20
AldoBaldo
Ah be', ma allora saresti in cpp e non in c...
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.
16/08/16 14:24
TheDarkJuster
Struct Vector {
char** tok;
Uint32 len;
}
aaa
16/08/16 14:30
AldoBaldo
Ah, avevo capito il vector di STL.

E con strutture come quella che hai descritto come fai a sapere in anticipo quanti elementi dovrai mettere nell'array/vettore? Per quel poco che riesco a immaginare dovresti fare due passate sui dati e, tra l'una e l'altra, allocare dinamicamente il vettore... mi sto perdendo qualcosa?
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.
16/08/16 14:54
TheDarkJuster
All'inizio avevo proposto la STL, ma poi visto che la domanda era sul C ho corretto :D

In realtà non ti serve sapere quanti elementi hai in anticipo, perchè ad ogni nuovo elemento fai memcpy, realloc, memcpy e aggiungi il nuovo token alla fine.

aaa
16/08/16 15:13
AldoBaldo
Non prendertela, ma mi sembra poco efficiente e soggetto a dover inserire un'infinità di verifiche d'errore (come ogni allocazione di memoria dinamica, che non ha mai esito certo).
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.
16/08/16 15:50
Sì, la strtok usa una variabile interna allocata "per thread" che mantiene traccia dell'ultimo risultato ottenuto.

Ma la soluzione ricorsiva mi sembra molto inefficiente. Sarebbe molto meglio una iterativa.
16/08/16 16:11
TheDarkJuster
AldoBaldo le critiche sulla allocazione dinamica hanno senso solo in certi contesti: se ho un allocatore di memoria che pre-alloca 2gb di memoria e uso quello per gestire la memoria non ho il problema dell'allocazione incerta: se il testo puù essere lungo al massimo 100kB sarei sicuro di non avere mai problemi: infatti la lunghezza minima del separatore è 0 caratteri, quindi ogni carattere è un token, mi serviranno al più sizeof(char*) * 100*1024 per il risultato, e il massimo ammontare di memoria occupata sarà : (sizeof(char*) * 100*1024) + ((sizeof(char*) * 100*1024) - 1) + 100kB sicuramente inferiori a 2GB.

Per quando riguarda la critica di nessuno.... Si, probabilmente quella funzione dovrebbe essere iterativo in un contesto di efficienza, ma non è come la farei io :D
aaa
16/08/16 17:34
AldoBaldo
Nessuna critica (figurati!) stavo cercando di capire.
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.