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
Graziecodice://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; } }



Rispondi quotando