Newsgroup: it.comp.lang.c
Titolo: vettore "sporco"

Ciao a tutti,
trovate il codice "incriminato" a questo indirizzo: 
http://phpfi.com/64962
il mio problema credo sia il vettore di caratteri riga.
Praticamente la funzione in questione prende un file alla volta legge una
riga alla volta e per ognuna prende ogni sua parola per poi stemmarla
(estrapolare la radice).
Se il file č uno va tutto ok, ma se i file sono piů di uno (vengono
passati in sequenza) succede che riga mi rimane "sporca".
Esempio pratico: se ho un documento di nove parole e quello seguente č di
sei, questa funzione mi stemma correttamente le nove parole ma al momento
di stemmare quello di sei mi inserisce anche le tre parole finali di
quello di nove.
Spero di essermi spiegata..
ho provato con
free(riga);
riga[0]='\0';
un ciclo che mi azzeri riga da 0 fino max_lenght.
ovviamente tutto questo perchč ho dato per scontato che l'errore stia in
riga, ma potrebbe anche non essere cosě..
Grazie mille.
Sara
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 passati in sequenza) succede che riga mi rimane "sporca".
Il frammento di codice non e' compilabile, quindi e' difficile fare 
delle prove e capire dove sta l'errore. Non si sa neanche cosa fanno
le funzioni quando gli passi parola.
L'unico errore grave che mi sembra di vedere, anche se non e'
necessariamente correlato con il malfunzionamento, e'
la free(parola).
Essendo che parola non e' stata da te allocata tramite calloc o
malloc, usare la free e' sbagliato e potrebbe portare a risultati
imprevedibili.
Allo stesso modo fare free(riga) dovrebbe essere
un errore, perche' riga viene allocata staticamente e non
puoi fare free di una cosa statica.
ciao,
g.

 g.
bè grazie mille :)
sara


 cmq quasi per certo tutto ciņ funziona.
Mah... e' codice molto banale, mi sembra strano trattarlo come
un segreto militare....
Prima che io mi dimentichi...: si dice LENGTH e non LENGHT
e' chiaro che non e' un errore di programma, ma se qualcuno
ti vede il codice non e' tanto bello....
In ogni caso noto una cosa che non necessariamente produce
l'errore ma comunque e' molto brutta:
Tu gia' usi strtok che non e' tanto una bella funzione, perche'
1) distrugge via via l'input (inizialmente conservato in riga[])
2) per funzionare si appoggia ad una sorta di variabile statica interna
che tiene traccia dell'avanzamento della tokenizzazione tra una
chiamata e un'altra (infatti nelle chiamate successive passi NULL).
Questo fa si che la strtok non sia "thread safe", perche'
piu' chiamate contemporanee in punti diversi del programma potrebbero
causare risultati errati.
A questo mi sembra di capire che tu aggiunga il fatto che Stem, quando
gli passi una stringa puntata da parola, di fatto modifica la stringa
puntata da parola (nel tuo esempio la accorcia).
Pero' parola non esiste come stringa, visto che parola altro non e' se
non un puntatatore che la strtok fa puntare all'interno di riga[],
quindi non vorrei che indirettamente Stem facesse casini su parola e
quindi su riga. A seconda di quello che ci fai sopra potrebbe anche
confondere le chiamate successive alla strtok.
In generale, io farei delle copie locali (magari su array locali che
non hai neanche bisogno di allocare e deallocare).
tipo:
char Lavoro[MAX_LENGTH];
dopo aver fatto parola = strtok(....);
strcpy(Lavoro,parola);
e dopo usi l'array Lavoro invece di parola.
ciao,

 ciao,
Grazie del consiglio proverň cosě..
