Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Passare una variabile a tutte le chiamate ricorsive

    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
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma parli di C# ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Ma parli di C# ?
    Scusami, non so come mi sia sfuggito il cancelletto, è C, ho corretto anche il titolo
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Questa e' una implementazione ricorsiva

    http://www.algorithmist.com/index.php/Merge_sort.cpp

    ... e' in C++ ma e' facilmente adattabile ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Questa e' una implementazione ricorsiva

    http://www.algorithmist.com/index.php/Merge_sort.cpp

    ... e' in C++ ma e' facilmente adattabile ...
    Gentilissimo, io l'ho già implementato, il mio problema è la gestione degli errori di allcoazione, cosa che nell'algoritmo che mi hai segnalato non viene fatta. Vorrei trovare un modo per gestire l'errore e quindi uscire in maniera corretta dall'algoritmo senza forzarlo.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  6. #6
    Originariamente inviato da Skull260287
    Gentilissimo, io l'ho già implementato, il mio problema è la gestione degli errori di allcoazione, cosa che nell'algoritmo che mi hai segnalato non viene fatta. Vorrei trovare un modo per gestire l'errore e quindi uscire in maniera corretta dall'algoritmo senza forzarlo.
    Nessuno riesce ad aiutarmi?
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.