Newsgroup: it.comp.lang.c
Titolo: Problemi con free (lp di Hohmeyer)

Ho uno strano problema con free() che mi sta facendo
impazzire.
Ho un programma (si tratta di lp, l'implementazione di
Hohmeyer dell'algoritmo di Seidel per la programmazione
lineare, nel caso qualcuno lo conosca), con questa struttura
main(){
    a=malloc...
    b=malloc..
    ec...
    for(r=0;r<R;r++)
        funzione(a,b,...);
    stampa_risultati
    free(a);
    free(b);
    ec..
    }
Il ciclo for serve solo per misurare il tempo di esecuzione.
La funzione chiamata non commette errori (credo..il
risultato è sempre corretto), non alloca ne libera memoria.
Succede pero' che per alcuni valori R si verificano degli
errori nelle operazioni di free().
Qualcuno ha idea di cosa possa essere (tipo un problema noto
a tutti tranne che a me)? Aggiungo che stampando i vettori
a,b ecc.. sembra essere tutto normale.
Ho già controllato che a,b ec. non siano NULL ...anzi, con
vari esperimenti, ho notato che non sono NULL neanche dopo i
"free". E' una cosa normale o e' indice che c'e' qualcosa di
strano?
Grazie mille
ciao
m
PS: se serve posso postare il codice, sono una trentina di K

 ha scritto nel
messaggio
news:xGL3b.275135$Ny5.8...@twister2.libero.it...
Preciso che uso il compilatore del Builder 3.0
Ciao
marco

 strano?
No, e` normale. free() libera l'area di memoria, non puo` settare a NULL
il puntatore. Ah, free(NULL) e` perfettamente lecito.
Kronos
-- 
Home: 
http://kronoz.cjb.net
Dicono che  il cane sia  il miglior  amico dell'uomo. Secondo me  non e`
vero. Quanti dei vostri amici avete fatto castrare, recentemente?

errori nelle operazioni di free().
Molto probabilmente vai a fare delle scritture oltre le
dimensioni che hai allocato. Questo in C non comporta
necessariamente che venga segnalato un errore in quel
punto, ma quello che succede di solito e' che le strutture
dati della libreria vengono rovinate e quindi, in un punto
successivo e "innocente", si ottengono altri errori.
Non e' che per caso usi gli array con indici 1..n invece
di 0..n-1 ? In C il primo elemento di un array di dimensione
N ha indice 0 e l'ultimo elemento ha indice N-1. Quindi in
quel caso se scrivi sull'elemento N stai scrivendo *fuori*
dall'array.
Nota che non e' improbabile che sia la scrittura che la
successiva lettura forniscano dati apparentemente "corretti"
... poiche' pero' stai danneggiando aree di memoria che non
ti erano state assegnate e' molto probabile che la cosa
generi problemi in seguito.
HTH
Andrea

 ha scritto nel
messaggio
news:xGL3b.275135$Ny5.8...@twister2.libero.it...
Grazie a tutti per le risposte. Ho scoperto che allocando
una cella in più a tutti i vettori non ho più errori
(facendo uno sproposito di prove, se è un caso me la prendo
direttamente con Dio), anche se non riesco a trovare il
punto in cui viene scritto in quella cella (avevo già
controllato tutti gli indici e sembravano giusti).
Quindi avevate ragione, l'esperienza...
Proverò anche a fare il test di Kronos (che sarà molto utile
anche in futuro, immagino) per vedere quale è quello che
sbaglia , Grazie mille
Ciao
m

 una cella in più a tutti i vettori non ho più errori
E questo rafforza la convinzione che stai andando a scrivere
fuori dalle aree di memoria allocate.
Invece di "scoprire" che allocando un elemento in piu' le cose
funzionano, "scopri" qual'e' il punto dove gestisci erroneamente
le scritture: in caso contrario l'errore potrebbe ripresentarsi.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Eh, ci sto provando... il problema è che il programma non
l'ho scritto io, non è commentato e gli indici dei vettori
escono da altri vettori 
ec.ec
..
Temo che dovro' ricorrere al debug..e ciò mi manda in
depressione :(
Ciao
m