Newsgroup: it.comp.lang.c
Titolo: problemi con le allocazioni di memoria

ciao a tutti, ho un grosso problema:
 // IL FRAME DATO E' DI UN'ALTRA SCENA? OPPURE E' STATO RAGGIUNTO MAX_GOF?
 if ((d / (o_width * o_height) > scene_threshold) || (frames >= max_gof)) {
  // CAMBIO SCENA
  o_gof_lenght = frames;
  output(encode(video));
  frames = 0;
 }
 frames++;
 // RIDIMENSIONIAMO IL BUFFER
 // QUI ABBIAMO UN'ERRORE: DOPO LA PRIMA CHIAMATA A ENCODE QUESTO REALLOC
PUNTA A 0x00000000...
 video = (buffer)realloc(video, o_width*o_height*frames);
questo codice č all'interno di una funzione che viene chiamata piů volte. la
prima volta viene chiamato malloc ed assegnato il ptr a video (di tipo
buffer = unsigned char *). dopo un tot di chiamate una delle condizioni
dell'if č soddisfatta e video viene passato a encode.
al ritorno, il realloc invece di dare un puntatore valido restituisce
0x00000000, mentre in tutte le altre occasioni restituisce un puntatore
valido.
nota: encode passa a sua volta il buffer ad alte funzioni che tra l'altro
operano anche dei realloc su di esso.
a cosa puň essere dovuto?
--
CAFxXcrossway -> 
www.cafxx.cjb.net

  video = (buffer)realloc(video, o_width*o_height*frames);
cosi' su due piedi sembra che:
o non c'e' piu' memoria, quindi ti torna (giustamente) NULL,
o la memoria che chiedi e' ==0
se la prima, c'e' poco da fare, cerca di liberare tutto quello che allochi.
se la seconda, fatti delle stampe mentre allochi e vedi quanta mem chiedi
di volta in volta
ciao
-- 
Er Baitch
"Live Your Life!!!" (Ring ain't a jail)
http://baitch.altervista.org/

 realloc su di esso. a cosa può essere dovuto?
Iniziare con l'aggiungere un:
if( !video )
	printf("Errore: %s\n", strerror(errno));
potrebbe aiutarti. Controlla anche quanto valgono
o_width*o_height*frames prima della chiamata magari
PS: il cast a realloc è superfluo
Ciao
Matix

 di volta in volta
questo no... quando si presenta l'errore č perchč sto riallocando la memoria
per averne di meno (ergo prima del realloc occupo molta piů memoria di
quanto non me ne serve dopo...) percui passo tipo da 13mb di prima ai 400kb
di dopo

 PS: il cast a realloc è superfluo
ah... ok.
domanda. questo buffer io lo passo ad alcune funzioni.
alcune ci esguono a loro volta dei realloc ed altre operazioni. può
dipendere da questo (anche se mi sembra strano)?

 a cosa può essere dovuto?
Alle 2 righe sopra. Ricorda che in C tutti gli argomenti delle funzioni
sono passati per copia. Ora considera questi 2 punti:
* realloc puo` decidere di allocare una nuova zona di memoria e copiarci
  il contenuto di quella vecchia nel caso non sia possibile un resize in
  place. In altre parola, il puntatore potrebbe puntare ad una zona di
  memoria diversa da quella che avevi prima.
* il passaggio di argomenti avviene per copia. In particolare quando
  chiami encode(video) passi il puntatore /video/ per *copia*. Le
  eventuali altre funzioni chiamano realloc che modifica il valore della
  copia locale del puntatore.
Quando encode(video) ritorna /video/ punta ancora alla vecchia area di
memoria. Alla successiva realloc viene passato un puntatore non piu`
valido, il risultato e` un undefined behaviour. La tua implementazione
si accorge della cosa e restituisce NULL, con altra libreria C potresti
ottenere un crash spettacolare.
Le soluzioni sono fondamentalmente 2:
* modifichi encode (e tutte le funzioni che riallocano) in modo che
  restituiscano il nuovo puntatore. Questo mi pare che non si possa fare
  perche` encode restituisce gia` qualcosa. Potresti pero` farlo per le
  funzioni chiamate all'interno di realloc.
* modifichi encode (e le altre funzioni) in modo che accettino un
  puntatore a puntatore. Tramite questa indirezione sei in grado di
  modificare il puntatore /video/ all'interno di encode e di propagare
  la modifica all'esterno.
Ovviamente puoi fare un ibrido tra le due.
Luca
-- 
Home: 
http://kronoz.cjb.net
This message will self distruct in 5 seconds.

 ha scritto nel messaggio
news:pan.2004.06.13....@spam.libero.it...


sospettavo qualcosa di simile.
grazie mille. non appena finita la matura provo.
--
CAFxXcrossway -> 
www.cafxx.cjb.net

 ultima domanda... 0x00000000 è NULL? (i dubbi che non sorgono alle volte...)
Ni :)
Se assegni il valore (intero) 0 ad un puntatore lo standard garantisce
che quel puntatore sara` NULL. Quello che lo standard non impone e` che
la rappresentazione interna del null pointer sia 0x00000000 (su 32bit).
Se non ricordo male, VC usa proprio 0xC0000000 come null pointer quando
e` attivo il debug della memoria.
Luca
-- 
Home: 
http://kronoz.cjb.net
"Ci sono le balle, le megaballe e le statistiche".
 Mark Twain