Salve a tutti ho implementato una versione del mergesort che utilizza l'allocazione dinamica del vettore di appoggio per effettuare le operazioni di ordinamento. Ho inserito il controllo per gestire gli errori di allocazione all'interno di questa funzione, solo che non riesco a trovare la strada che mi permetta di fermare la chiamata ricorsiva che genera l'errore e di conseguenza tutte le eventuali altre. Tutto questo deve essere fatto senza forzare l'uscita dalla ricorsione, ma in maniera naturale. Vi ringrazio per l'aiuto e vi posto il codice della funzione ricorsiva MergeSort
codice:
//Funzione ricorsiva utilizzata per dividere il vettore iniziale in sottovettori
//fino a raggiungere il caso banale del vettore di un solo elemento
int MergeSort( SCHEDA** Pers, //Array contenente i contatti da riordinare
int Inizio, //Inizio del vettore da ordinare (Inizialmente 0)
int Fine, //Fine del vettore da ordinare
//( Inizialmente NumContact-1 )
int* Error, //Identifica l'eventuale errore di allocazione del
//vettore di supporto per effettuare gli ordinamenti
int (*Confronta)(SCHEDA*, SCHEDA*) //Puntatore a funzione per
//effettuare i confronti
)
{
SCHEDA** TempOrd; //Vettore temporaneo per effettuare l'ordinamento
int Medio; //Indice mediano del vettore in esame
if( Inizio < Fine && *Error!=992 )//Se vi sono ancora sottovettori da dividere
//e non è avvenuto un errore di allocazione
{
Medio=(Inizio+Fine)/2; //Scelgo il punto medio del vettore in esame
MergeSort( Pers, Inizio, Medio, Error, (*Confronta) ); //Richiamo sul
//sottovettore sinistro
MergeSort( Pers, Medio+1, Fine, Error, (*Confronta) ); //Richiamo sul
//sottovettore destro
//Alloco dinamicamente il vettore utilizzato per effettuare l'ordinamento
TempOrd=(SCHEDA**) malloc( (Fine-Inizio+1)*sizeof(SCHEDA*));
if( *Error!=992 && TempOrd!=NULL ) //Se il vettore è stato correttamente
//allocato e non sono avvenuti errori di allocazione in altre
//chiamate ricorsive alla funzione mergesort
{
//Effettuo l'ordinamento del sottovettore
Merge( Pers, TempOrd, Inizio, Medio, Fine, (*Confronta) );
free( TempOrd ); //Dealloco lo spazio occupato dal vettore utilizzato per
//effettuare l'ordinamento
}
else *Error=992;
}
}
Grazie