Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C]Crash funzione

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53

    [C]Crash funzione

    Ciao a tutti.
    In relazione al thread da me aperto:

    http://forum.html.it/forum/showthrea...readid=1529337

    vi riporto il codice della funzione che mi causa l'errore. Precedentemente vi era un errore prima di questa e correggendolo l'errore mi si è spostato, quindi mi viene da pensare che ho commesso gli errori in "coppia" per una mia interpretazione maldestra.
    Questa funzione prende in ingresso un array di interi, la testa del grafo precedentemente acquisito, la dim di esso e la dimensione del nuovo sottografo che verrà creato a aprtire dall'array di inetri.
    L'array contiene solamente 0 e 1 che rappresentano il fatto che il nodo con nome i è presente nel sottografo (puntatore[i] vale 1) oppure no (puntatore[i] vale 0). Quindi nella prima fase che può sembrare insensata sto mettendo tutti i nomi dei nodi che dovranno far parte del nuovo sottografo in un array.
    Ecco il codice:
    codice:
    /*************************************************/
    /*Definizione della funzione verifica_connessione*/
    /*************************************************/
    int verifica_connessioni(int* puntatore,vertice_grafo_t *testa_v, int nodi, int nodi_sottografo)
    {
         int verifica,/*variabile da restituire, se 0->grafo non connesso, se 1->grafo connesso*/
             i,j;/*indici di sscorrimento*/
    
         int sottografo[nodi_sottografo];/*vettore che conterrà il nome dei vertici che compongono l'individuo*/
         int *visitati;/*puntatore per contenere il valore di ritorno della funzione avvia_visita_grafo_amp(...);*/
         vertice_grafo_t *vertice, *testa_sottografo, *vertice_grafo, *vertice_adiac;
         arco_grafo_t *testa_a, *arco;/*puntatore a un arco del grafo e alla testa lista archi*/
         
         printf("verifica_connessioni: attiva...\n");
         /*metto i vertici del sottografo in un array*/
         for(i=0, j=0;i<nodi;i++)
         {
             /*se la posizione i dell'array contiene un 1*/ 
             if(puntatore[i] ==1)
             {
                 /*allora memorizzo il valore di indice nel array che contiene i vertici del sottografo*/
                 sottografo[j] = i;
                 /*mi sposto in una nuova cella del sottografo*/
                 j++;
             }
                 
         }
         
         /*creo la lista primaria dei vertici*/;
         testa_sottografo = vertice =(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
         /*nomino il primo vertice*/
         vertice->nome = sottografo[0];
         /*pongo il puntatore al successivo a NULL*/
         vertice->lista_archi = NULL;
         /*procedo a creare gli altri vertici*/
         for(i=1;i<nodi_sottografo;i++)
         {
             /*alloco spazio per il vertice successivo*/
             vertice->next=(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
             /*punto al vertice successivo*/
             vertice = vertice->next;
             /*nomino il vertice*/
             vertice->nome = sottografo[i];
             /*pongo il puntatore al successivo a NULL*/
             vertice->lista_archi = NULL;
             
         }
         vertice->next = NULL;
         /*creo la lista secondaria*/
         /*scorro l'array individuo*/
         for(i=0, vertice = testa_sottografo ;i<nodi_sottografo;i++)
         {
             /*per ogni vertice nell'individuo lo cerco nella lista primaria del grafo*/
             for(vertice_grafo = testa_v; vertice_grafo != NULL; vertice_grafo = vertice_grafo-> next)
             {
                 /*cerco il vertice che abbia lo stesso nome di quello contenuto nella posizione i di sottografo*/
                 if(sottografo[i] == vertice_grafo->nome)
                 {
                     /*controllo, per ogni arco della sua lista archi, se il vertice adiacente è persente nel sottografo*/
                     for(arco = vertice_grafo->lista_archi; arco != NULL ; arco = arco->next)
                     {
                          printf("Si blocca qui dopo un certo numero di iterazioni\n");
                         /*scorro gli elementi dell'array sottografo*/
                         for(j=0;j<nodi_sottografo;j++)
                         {
                             printf("Oppure qua, dipende dalle esecuzioni\n");
                             //printf("Confronto %d con %d con j = %d\n", arco->vertice_adiac->nome, sottografo[j], j);
                             /*se il vertice adiacente a questo arco è presente nel sottografo, aggiungo questo arco*/
                             if(arco->vertice_adiac->nome == sottografo[j])
                             {
                                 /*cerco il vertice adiacente nella lista primaria del mio sottografo*/
                                 vertice_adiac = testa_sottografo;
                                 while(vertice_adiac->nome != arco->vertice_adiac->nome)
                                 {
                                     vertice_adiac = vertice_adiac->next;
                                 }
                                 /*se il vertice non possiede ancora una lista archi la creiamo*/
                                 if(vertice->lista_archi == NULL)
                                 {
                                     /*creo un nuovo arco*/
                                     vertice->lista_archi = (arco_grafo_t *)malloc(sizeof(arco_grafo_t));
                                     /*potrebbe essere il primo e unico arco aggiunto*/
                                     vertice->lista_archi->next = NULL;
                                     /*regolo il puntatore al vertice adiacente*/
                                     vertice->lista_archi->vertice_adiac = vertice_adiac;
                                     /*copio il peso dell'arco del grafo nell'arco del sottografo*/
                                     vertice->lista_archi->peso = arco->peso;
                                 }/*end if*/
                                 /*se la lista archi esiste già*/
                                 else
                                 {
                                     /*cerco la coda della lista archi*/
                                     testa_a = vertice->lista_archi;
                                     while(testa_a->next != NULL)
                                     {
                                         testa_a = testa_a->next;
                                     }
                                     /*aggiungo il nuovo arco in coda*/
                                     testa_a->next = (arco_grafo_t *)malloc(sizeof(arco_grafo_t));
                                     /*punto alla nuova locazione*/
                                     testa_a = testa_a->next;
                                     /*metto il puntatore all'arco successivo al nuovo aggiungo a NULL*/
                                     testa_a->next = NULL;
                                     /*regolo il puntatore al vertice adiacente*/
                                     testa_a->vertice_adiac = vertice_adiac;
                                     /*copio il peso dell'arco del grafo nell'arco del sottografo*/
                                     testa_a->peso = arco->peso;
                                     //printf("Aggiungo l'arco di peso %.2lf al vertice %d.\n", arco->peso, vertice->nome);
                                 }/*end else*/
                             }/*end if*/
                         }/*end for*/
    
                     }/*end for*/         
                 }/*end if*/
             }/*end for*/
                          /*passo al vertice del sottografo successivo*/
             vertice = vertice-> next;
         }/*end for*/
         /*acquisisco il vettore contenente i vertici visitati*/
         visitati = avvia_visita_grafo_amp(testa_sottografo, nodi_sottografo);
         /*confronto i vertici visitati con quelli del sottografo*/
         for(i=0;i<nodi_sottografo;i++)
         {
             if(sottografo[i] != visitati[i])
                 verifica = 0;
             else
                 verifica = 1;
         }
    
         /*dealloco il sottografo*/
    
         for(vertice = testa_sottografo; vertice->next != NULL; vertice = vertice->next)
         {
              free(vertice);
         }
         free(testa_sottografo);
         
         printf("Verifica: %d.\n", verifica);
         
         return(verifica);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    In particolare posso affermare che finchè verifico grafi NON connessi, il programma fila liscio, richiama tutte le funzioni del caso e restituisce i risultati corretti, al primo grafo connesso che gli passo lui si ferma dove sono le printf rosse.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Purtroppo, per la complessità della funzione e la sua forte dipendenza dallo stato dei dati, è praticamente impossibile risalire al problema senza fare debugging con il programma attivo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Nel caso la costruzione di un programma per grafi sia solo il mezzo e non il fine mi permetto di consigliarti delle librerie apposite (alcune di queste fanno pure la visualizzazione) un elenco qui: http://stackoverflow.com/questions/2...-should-i-use. Ciao.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.