Newsgroup: it.comp.lang.c
Titolo: Esame universitario tra 10 giorni! HELP!

Scusate in anticipo la lunghezza del messaggio, ed ascoltate il mio
grido acuto di soccorso! ;-) Ho davvero bisogno che qualche anima pia
dia un'occhiata al mio prg...
Ho scritto un programma che gestisca un semplice database di cd
musicali.
Scusate se il msg è lungo, ma devo presentare ciò che ho fatto, e non
padroneggio ancora a dovere il gergo della programmazione. :-)
Siccome sono masochista mi sono andato a complicare la vita... :-(
sigh... Il fatto è che volevo dimostrare all'insegnante che so gestire
correttamente una lista e la ricorsione (l'ho usata nel sort)... cosa
volete... per un 30 si farebbe di tutto! ;-)
Ho definito una struttura che ho chiamato lstringa, che gestisce una
lista di singoli char (singolo char e puntatore all'elemento
seguente), per non avere problemi con la lunghezza di una riga in
input da file, e diverse funzioni che ne fanno uso:
- 1 - prende la riga da file e la trasforma in una suddetta lista;
- 2 - prende una lstringa (ottenuta con la funzione precedente) e ne
estrae una stringa, posizionandosi sul carattere seguente al primo
'\0' che trova, e deallocando con la free lo spazio occupato dai
caratteri precedenti;
- 3 - una strlen personalizzata (mystrlen) che funziona come
l'originale su una lstringa.
In pratica uso due file: uno per l'archivio dei cd nel seguente
formato
XXXX;titolo;autore;mmss
e uno per i brani
XXXX;titolo;YY;mmss
Dove XXXX è un codice identificativo (uguale per il cd ed il brano
eventualmente contenuto) e YY il numero d'ordine.
Poi leggo tutto l'archivio dei CD e con le funzioni di sopra genero
una lista in memoria.
Finita la lista dei cd, leggo il file dei brani, e attacco
(all'apposito puntatore che si trova nella struttura del record cd)
un'altra lista che contiene i brani del cd stesso.
In pratica uso una "macrolista" che contiene le informazioni sui cd,
collegati ciascuno ad una "microlista" dei propri brani.
Fino all'altro ieri sembrava funzionare correttamente, e credevo di
aver fatto un uso corretto di puntatori e allocazione/deallocazione di
memoria.
Ieri ho provato ad aggiungere un CD alla lista e PUFF... inchiodamento
pesante... Sembra che dopo il 14° elemento inizi a fare casino... :-(
Ma presumo che già lo facesse, seppure in maniera silente.
Tutto lascia immaginare un problema di gestione dei puntatori. :-(
Ho riletto tre volte le parti in cui utilizzo la malloc e la free, ed
ho cercato dove correggere puntatori erranti, ma non ho trovato
niente, a parte qualche piccola correzione prevalentemente stilistica
(sostituire dei do{}while(); con dei for, e roba simile).
Premetto che il programma non è cortissimo, ma non mi sembra
mortalmente complicato.
Qualcuno di voi potrebbe farmi l'immenso piacere di dare
un'occhiata?... :-) Non a tutto il programma, ovviamente, ma alla
parte che riguarda il caricamento dei dati da file, visto che si
inchioda proprio in quel momento.
Nel corso di questo weekend sono impegnato (non per vacanza: ho un
esame di elettrotecnica), per cui no mi farò vivo fino a lunedì sera.
Se qualcuno volesse aiutarmi, può scrivere una mail
all'autorisponditore 
sorg...@atletica-calvesi.valleaosta.it
E riceverà i file in risposta, con la mia gratitudine eterna! ;-)
(quella però non arriva in attach, tranquilli!)
Altrimenti lunedì mi rimboccherò le maniche come al solito, e amici
come prima!. :-)

>Sembra che dopo il 14° elemento inizi a fare casino... :-(
Per esperienza, stai allocando troppa poca memoria, così scrivi oltre ai
confini pacioccando con i dati privati di malloc. Prova a cercare dove
crasha il tuo prog con un debugger. Prova ad allocare memoria in più. Tieni
conto che per una stringa terminata correttamente con '\0' servono strlen +1
char. Prova ad allocare memoria in più, se il problema sparisce cerca dove
avevi sbagliato. Prova anche a guardare cosa succede coi puntatori nulli, ma
di solito se crasha sempre ad un determinato elemento è per quello che ti ho
detto sopra.
Lanugo che gli è sucesso una volta e quando andrà all'uni arriverà preparato
a questo

detto sopra.
Infatti i puntatori nulli sono tutti corretti!
Comunque ho scoperto come evitare il crash... ho brutalmente rimosso
tutte le free. Sono quelle a far casino.
Adesso mi darò da fare per ripristinarle una ad una...
P.s.: grazie della risposta comunque! I tuoi consigli sono
utilissimi!... In realtà speravo che qualcuno desse un'occhiata al
codice, ma non si può pretendere troppo dalla vita. :-)
ciaooo!!!

codice, ma non si può pretendere troppo dalla vita. :-)
Ma l'hai postato?
Lanugo


The trouble with being poor is that it takes up all your time.

 prova ad usare calloc() invece di malloc()..... 
che cazz*ata !!! scusate .... e' l'orario ;-))))
