Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema su
Forum - C/C++ - Problema su "Errore di Segmentazione"

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Jimmy_5 (Normal User)
Newbie


Messaggi: 11
Iscritto: 09/12/2011

Segnala al moderatore
Postato alle 12:59
Venerdì, 09/12/2011
Dunque il codice che posto è ridotto al minimo (è all'interno di una parte più corposa, ma son riuscito a ridurlo a questa sezione, che è quella critica). Mi dà errore di segmentazione non riesco a capirne il motivo. Quello che credo faccia questo codice è: inizializzo un array di oggetti tipo ADJ_node, e inizializzo ciascun campo "valore" al valore "i" , dopodichè vado a stampare questo valore.
Mi dà errore di segmentazione.

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(int argc, char *argv[]) {
  5.  
  6. struct ADJ_node{      
  7. int peso;
  8. int valore;
  9. ADJ_node* next;
  10. };
  11.  
  12. int nodi=10;
  13. ADJ_node** ADJ=new ADJ_node* [nodi];
  14. for(int i=0;i<nodi;i++)
  15.     ADJ[i]->valore=i;
  16.    
  17.    
  18. for(int i=0;i<nodi;i++){
  19.         cout<<ADJ[i]->valore;
  20. }
  21.  
  22. return 0;
  23.      
  24. }


PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 13:31
Venerdì, 09/12/2011
nel primo ciclo, prova a fare cosi

Codice sorgente - presumibilmente C/C++

  1. for(int i=0;i<nodi;i++)
  2. {
  3.     ADJ[i] = new ADJ_node();
  4.     ADJ[i]->valore=i;
  5. }


PM Quote
Avatar
Jimmy_5 (Normal User)
Newbie


Messaggi: 11
Iscritto: 09/12/2011

Segnala al moderatore
Postato alle 13:37
Venerdì, 09/12/2011
Mmh il problema, in generale, è questo: ho un progetto in cui devo generare un grafo con random nodi, aventi random adiacenze, controllarne il grafo connesso e il cammino minimo.
Quindi non posso creare i nodi al momento della loro stampa, perchè la loro generazione avviene nel modulo "Genera_grafo.cc" (in maniera indipendente dalla stampa come ho detto).

EDIT:: grazie per la risposta, ho capito, sono un babbo, mi son scordato di fare il new per creare singolarmente i nodi... grazie mille ;)

EDIT2:: dunque il problema è cambiato: se metto tutto il codice di "genera_grafo_casuale()" nel corpo del "main()" funziona bene, se invece provo a chiamare quel codice tramite chiamata di funzione dal "main()" mi dà Errore di segmentazione.

Allego versione codice NON funzionante
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4.  
  5. //definizione lista per nodi adiacenti a un generico nodo V
  6. struct ADJ_node{      
  7. int peso;
  8. int valore;
  9. ADJ_node* next;
  10. };
  11.  
  12. const int min_adiacenze=1, max_adiacenze=4, min_nodi=15, max_nodi=25;        //vincoli sulla
  13. int nodi;                                                                    //densità del grafo
  14.  
  15.  
  16. //definizione array, ogni cella composta dalla testa di una lista
  17. ADJ_node** ADJ;
  18.  
  19. //sentinella unica per tutte le liste di adiacenza
  20. ADJ_node* sentinella;
  21.  
  22.  
  23. int random(const int min, const int max){
  24.  
  25. srand(time(0));
  26.  
  27. int n;
  28. n=min+rand()% (max - min);
  29.  
  30. return n;
  31.  
  32. }
  33.  
  34. void aggiungi_adiacenza(ADJ_node** ADJ, int u, int v, int peso){
  35.  
  36. ADJ_node* p=new ADJ_node;
  37. p->next=ADJ[u]->next;
  38. ADJ[u]->next=p;
  39. p->valore=v;
  40. p->peso=peso;
  41.  
  42. }
  43.  
  44. int length_list(ADJ_node** ADJ, int n){     //conto i nodi di una lista, serve per non superare max_autoadiacenze
  45.  
  46. int count=0;
  47. for(ADJ_node* p=ADJ[n]->next;p!=0;p=p->next)
  48.     count++;
  49.  
  50. return count;
  51.  
  52. }
  53.  
  54.  
  55. void genera_grafo_casuale(int &nodi, const int min_nodi, const int max_nodi, ADJ_node** ADJ, ADJ_node* sentinella, const int min_adiacenze, const int max_adiacenze){ //ADJ e sentinella costanti?
  56.  
  57. int adiacenze;
  58. nodi=random(min_nodi, max_nodi);
  59. ADJ=new ADJ_node* [nodi];
  60.  
  61. sentinella=new ADJ_node;  //sentinella unica per tutte le liste di adiacenza
  62. sentinella->valore=0;
  63. sentinella->peso=0;
  64. sentinella->next=0;
  65.  
  66.  
  67. for(int i=0;i<nodi;i++){
  68.     ADJ[i]=new ADJ_node;
  69.     ADJ[i]->valore=i;
  70.     ADJ[i]->peso=0;
  71.     ADJ[i]->next=sentinella;
  72.     }
  73.    
  74.  
  75.  
  76. for(int i=0;i<nodi;i++){  
  77.    adiacenze=random(min_adiacenze+1, max_adiacenze);  //stabilisco, per ciascun nodo, il suo numero indicativo di adiacenze, il +1 è riferito alla sentinella che è già stata inserita, ma non deve essere influente nel num adiacenze
  78.    for(int j=0;((j<adiacenze)&&((length_list(ADJ, i))<max_adiacenze));j++){    //inserimento adiacenza(j) nella lista di ADJ[i] e viceversa
  79.        int n=rand()% nodi, peso=rand()% 30+1;
  80.        if((n!=i)&&((length_list(ADJ, n))<max_adiacenze)){       //no autoadiacenza e adiacenze di troppo
  81.           aggiungi_adiacenza(ADJ, i, n, peso);
  82.           aggiungi_adiacenza(ADJ, n, i, peso);
  83.        }
  84.        else
  85.           j--; //se il nodo trovato random ha gia adiacenze=max_adiacenze, mantengo invariate il num di adiacenze per il nodo i
  86.    }
  87.  
  88. }
  89.  
  90.  
  91. }
  92.  
  93.  
  94. int main(int argc, char *argv[]) {
  95.  
  96. genera_grafo_casuale(nodi,min_nodi,max_nodi,ADJ,sentinella,min_adiacenze,max_adiacenze);
  97.  
  98. for(int i=0;i<nodi;i++){
  99.     for(ADJ_node* p=ADJ[i];p!=0;p=p->next)
  100.         cout<<p->valore<<" ";
  101.     cout<<endl;
  102. }
  103.  
  104.  
  105. return 0;
  106.      
  107. }


Ultima modifica effettuata da Jimmy_5 il 09/12/2011 alle 17:45
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6387
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:08
Venerdì, 09/12/2011
Testo quotato

Postato originariamente da Jimmy_5:

EDIT:: grazie per la risposta, ho capito, sono un babbo, mi son scordato di fare il new per creare singolarmente i nodi... grazie mille ;)



Sei un babbo nel senso che hai dei figli ? :)

(Era una battuta ... benvenuto)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Jimmy_5 (Normal User)
Newbie


Messaggi: 11
Iscritto: 09/12/2011

Segnala al moderatore
Postato alle 17:12
Venerdì, 09/12/2011
hehe nono è ancora presto, per adesso siamo agli studi in facoltà^^
Comunque ho fatto l'EDIT2, il problema continua (sempre segmentation fault, ma credo sia più sottile il problema rispetto a prima)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:41
Venerdì, 09/12/2011
Nel tuo ultimo codice, "nodi" non e' inizializzato (o forse lo e', implicitamente a zero).


Il mio blog: https://piero.dev
PM Quote
Avatar
Jimmy_5 (Normal User)
Newbie


Messaggi: 11
Iscritto: 09/12/2011

Segnala al moderatore
Postato alle 17:48
Venerdì, 09/12/2011
Si ma il valore casuale di "nodi" viene rimpiazzato subito, prima dell'accesso ai nodi in questione: come si entra nella funzione si ha

Codice sorgente - presumibilmente Plain Text

  1. nodi=random(min_nodi, max_nodi);
  2. ADJ=new ADJ_node* [nodi];



quindi ancora non ho un accesso fuori dagli indirizzi


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:17
Venerdì, 09/12/2011
Io non capisco che senso ha definire variabili globali come nodi, ADJ, min_adiacenze, etc. e poi passarle come parametro ad una funzione; se sono globali sono globali!

Questa confusione e' anche la causa del problema.

Codice sorgente - presumibilmente C/C++

  1. int main(int argc, char *argv[]) {
  2.      
  3.     genera_grafo_casuale(nodi,min_nodi,max_nodi,ADJ,sentinella,min_adiacenze,max_adiacenze);
  4.      
  5.    
  6.     for(int i=0;i<nodi;i++){
  7.         for(ADJ_node* p=ADJ[i];p!=0;p=p->next)
  8.             cout<<p->valore<<" ";
  9.         cout<<endl;
  10.     }
  11.      
  12.      
  13.     return 0;
  14.          
  15.     }



ADJ all'interno del ciclo for fa riferimento all'istanza globale di ADJ, che ha valore zero (che non puoi dereferenziare). ADJ lo stai passando by-value, non by-reference a genera_grafo_casuale.

Ultima modifica effettuata da pierotofy il 09/12/2011 alle 18:17


Il mio blog: https://piero.dev
PM Quote
Avatar
Jimmy_5 (Normal User)
Newbie


Messaggi: 11
Iscritto: 09/12/2011

Segnala al moderatore
Postato alle 18:38
Venerdì, 09/12/2011
Quelle in teoria le ho dentro un header.... però non potevo postare anche quello, le ho messe direttamente dentro il codice postato, quelle che servivano; altrimenti gli metto #include "struttura_dati.h"

EDIT:: esattamente, dannato puntatore, grazie per l'aiuto, ora posso proseguire con glade (scoppio di gioia a usare sw obsoleto..:yup: )

Ultima modifica effettuata da Jimmy_5 il 09/12/2011 alle 18:47
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo