PDA

Visualizza la versione completa : [C] Problemi di deallocazione (signal SIGTRAP)


johnnny
04-06-2014, 18:21
Ragazzi ho problemi con la deallocazione di una coda a prioritÓ, vi posto il Main (dove ci sono i puntini si trova semplicemente l'inizializzazione delle callback) e vi posto le funzioni interessate.

Main :


int main(int argc, char *argv[]){
srand(time(NULL));
elem *vet,*m,*val;
Heap_A *A;
int n,i,choice,pos,prior;
void *inf;
function *f;

A=Heap_Arr_Create(A);
.
.
.

A->buf=1;
A->first=(elem *)malloc(sizeof(elem));
printf("\n Inserisci il dato : ");
(A->first)->dato=f->Input();
(A->first)->prior=random(0,30);
A->size++;
break;
}
}
do {
system("cls");
printf("\n\n Scegliere il tipo di operazione da effettuare ");
printf("\n (1) Inserire un nuovo elemento ");
printf("\n (2) Stampa il valore massimo della coda a priorita' ");
printf("\n (3) Estrai il valore massimo della coda a priorita' ");
printf("\n (4) Stampa il contenuto della coda a priorita' ");
printf("\n (5) Cancella un elemento dalla coda a priorita' ");
printf("\n (6) Incrementa la priorita' di un dato ");
printf("\n (7) Decrementa la priorita' di un dato ");
printf("\n (0) Esci dall'esecuzione del programma ");
printf("\n\n Tasto digitato : ");
scanf("%d",&choice);
getchar();

switch(choice){
case 1 : {
val=(elem *)malloc(sizeof(elem));
printf("\n\n Inserisci elemento da inserire \n");
printf("\n Priorita' : ");
scanf("%d",&(val->prior));
getchar();
printf(" Dato : ");
val->dato=f->Input();
/*if((A->size)>=(A->buf)){
A->buf=(A->buf)*2;
A->first=(elem *)realloc(A->first,A->buf*sizeof(elem));
}*/
Insert_key(A,val);
break;
}


Funzione INSERT_KEY:



void Insert_key(Heap_A *A,elem *val){
A->size++;
if((A->size)>=(A->buf)){
A->buf=(A->buf)*2;
A->first=(elem *)realloc(A->first,A->buf*sizeof(elem));
}
(A->first+(A->size-1))->prior=INT_MIN;
(A->first+(A->size-1))->dato=val->dato;
Increase_key(A,(A->size-1),val->prior);
free(val);
}


Quest'ultima Ŕ la funzione chiamata alla fine del main il cui scopo sarebbe quello di deallocare la struttura realizzata:

Funzione CHE DEALLOCA:


void Free_Arr(Heap_A *A){
int i=(A->size)-1;
while(i>=0){
free((A->first)+i);
i--;
}
}


E' chiamata alla fine del main in questo modo : Free_Arr(A);

Ecco le due strutture utilizzate :


struct elemento{
int prior;
void *dato;
};
typedef struct elemento elem;


struct infor{
int size; //Grandezza dello heap
int buf; //Dimensione del buffer
struct elemento *first;
};
typedef struct infor Heap_A;

johnnny
04-06-2014, 23:42
Ragazzi, mi restituisce un SIGTRAP nel momento in cui un attimo prima della fine dell'esecuzione viene chiamata la funzione che dealloca, c'Ŕ qualcuno che sa scovare il problema ?

johnnny
12-06-2014, 01:04
Qualche buon anima che scova perchŔ mi da questo"Segmentation Fault" ?
Faccio notare che se ho un solo elemento non da alcun problema, questi iniziano a nascere nel momento in cui ho pi¨ di un elemento.

Loading