Newsgroup: it.comp.lang.c++
Titolo: AIUTO!! Errore incomprensibile con vector!!!

Salve a tutti, sono nuovo di questo gruppo e vorrei esporvi un mio
grosso problema:
ho queste 2 classi:
class Grafo
{
 private:
     std::vector<elem> matrice;
     int best;
     std::ofstream g_file;
 public:
     inline void insert_row( elem t ){ matrice.push_back( t ); }
     //costruttori e altri metodi d'accesso che non interessano ora..
}
class elem
{
 private:
     std::vector<int> cromosoma;
     int fitness;
     float pC;
 public:
     //costruttori e altri metodi d'accesso non interessanti
}
ora.. la classe grafo ha un metodo che legge da file dei numeri
organizzati in forma di matrice. ogni riga di questa matrice finisce in
un oggetto elem( i numeri letti vanno nel vector<int>cromosoma di elem
) ed infine quest'oggetto viene messo in coda al vector<elem>matrice
della classe grafo tramite il metodo insert_row( t ) con un codice del
tipo
while( leggi_riga_da_file( "nomefile.txt", ios::in ) )
{
    elem t;
    t.insert_valori( valori );
    insert_row( t );
}
questa ovviamente è solo una pseudocodifica per spiegare a grandi
linee quello che fa..
ora il problema è questo: quando la matrice che leggo ha un numero di
righe multiplo di 2 ( 2, 4, 8, 16, 32, 64... ) mi crasha il programma
dandomi un'errore di accesso alla memoria sotto windows e un
segmentation fault sotto linux. invece se leggo matrici con un
qualsiasi altro numero di righe non c'è nessun tipo di problema!!!!
come faccio?? sono disperato!! ed inoltre non posso cambiare
rappresentazione perchè ho poco tempo e dovrei riscrivere troppo
codice..
faccio notare inoltre che il ciclo si blocca sempre alla 5a chiamata di
insert_row( t ).
giuro non so proprio cosa fare.. aiutatemi voi per favore.
grazie a tutti!!

 linee quello che fa..
Non importa molto come leggi i dati, ma t.inser_valori( valori ) non ha 
alcun senso a meno che:
-) non fai vedere il costruttore di elem (e quindi di t)
-) non dici cosa è valori
-) non ci dai il codice di insert_valori

chiedo scusa per il post precedente.. mi rendo conto che non era
sufficientemente esplicativo. allora il programma è cosi strutturato:
//file grafo.h
class Grafo
{
 private:
     std::vector<elem> matrice;
     int best;
     std::ofstream g_file;
 public:
     Grafo( const std::string& filename, const std::string& g_filename
);
     Grafo( Grafo& Source, int dim, const std::string& g_filename );
     inline void insert_row( elem t ){ matrice.push_back( t ); }
}
dove il primo costruttore legge i numeri da un file e li assegna al
vector<elem> matrice
//file grafo.cpp
Grafo::Grafo( Grafo& Source, int dim, const std::string& g_filename ):
              g_file( g_filename.c_str(), ios::out ), best( 0 )
{
      vector<int> valori;
      for ( int i = 0; i < Source.get_size_row(); i++ )
      {
          valori.push_back( i );
      }
      for ( int i = 0; i < dim; i++ )
      {
          elem tmp;
          permute_random( valori );//funzione che genera permutazioni
random
          tmp.insert_value( 0, 0.0F, valori );
          insert_row( tmp );
      }
      assegna_fitness( Source );
      write( 1 );
}
//file elem.h
class elem
{
 private:
     std::vector<int> cromosoma;
     int fitness;
     float pC;
 public:
     elem(){}
     elem( int c_lenght ) : cromosoma( c_lenght, 0 ), fitness( 0 ), pC(
0.0F ){}
     void insert_value( int val_f, float val_pC, std::vector<int> val_c
);
}
//file elem.cpp
void elem::insert_value( int val_f, float val_pC, std::vector<int>
val_c )
{
     cromosoma = val_c;
     fitness = val_f;
     pC = val_pC;
}
//main.cpp
int main()
{
    string filename = get_file(); //funzione che acquisisce nome di
file da tastiera
    Grafo G( file_name, "matrice.txt" );
    Grafo M_OX( G, 10, "popolazione_OX.txt" );
    return 0;
}
l'errore avviene quando creo M_OX e G è una matrice di dimensione
multipla di 2.
spero di essere stato esauriente.
premetto che i file sono inclusi nell'ordine giusto, che non ci sono
errori di sintassi tipo ; mancanti o cose del genere. il programma
viene compilato correttamente. il problema è che con quel tipo di
matrici mi da errore di segmentation fault o errato accesso alla
memoria..vi prego aiutatemi..

chiedo scusa per il post precedente.. mi rendo conto che non era
sufficientemente esplicativo. allora il programma è cosi strutturato:
//file grafo.h
class Grafo
{
 private:
     std::vector<elem> matrice;
     int best;
     std::ofstream g_file;
 public:
     Grafo( const std::string& filename, const std::string& g_filename
);
     Grafo( Grafo& Source, int dim, const std::string& g_filename );
     inline void insert_row( elem t ){ matrice.push_back( t ); }
}
dove il primo costruttore legge i numeri da un file e li assegna al
vector<elem> matrice
//file grafo.cpp
Grafo::Grafo( Grafo& Source, int dim, const std::string& g_filename ):
              g_file( g_filename.c_str(), ios::out ), best( 0 )
{
      vector<int> valori;
      for ( int i = 0; i < Source.get_size_row(); i++ )
      {
          valori.push_back( i );
      }
      for ( int i = 0; i < dim; i++ )
      {
          elem tmp;
          permute_random( valori );//funzione che genera permutazioni
random
          tmp.insert_value( 0, 0.0F, valori );
          insert_row( tmp );
      }
      assegna_fitness( Source );
      write( 1 );
}
//file elem.h
class elem
{
 private:
     std::vector<int> cromosoma;
     int fitness;
     float pC;
 public:


 }
!!!
Ma che compilatore usi?
Kiuhnm

 Kiuhnm
beh.. l'ho compilato sotto windows con il mingW e il DJGPP, sotto linux
invece con g++ 3.2 e  3.4... perchè?

 invece con g++ 3.2 e  3.4... perchè?
Mancano addirittura dei ';'!
Il codice
class M
{
}
è sbagliato.
La versione corretta è
class M
{
};
Come fa a compilartisi?
Kiuhnm

a si scusate.. comunque ho precisato che non ci sono errori di
sintassi.. se manca qualche ; o , o . o qualcos'altro vuol dire che
sono stato io a sbagliare a copiare.. il problema è nella struttura ma
non capisco dove..


Te l'ho già detto l'altra volta.
NON COPIARE A MANO
Crea un progetto minimale, che compila. E posta il codice completo con 
cut&paste.
Sei tu che hai un problema. E se vuoi che noi ti aiutiamo GRATIS a 
cercare una soluzione, perlomeno vedi di fare TU la fatica di postare 
codice corretto.
Se vuoi un'alternativa, non c'è problema: manda specifiche e codice 
attuale (non la versione minimale) a info chiocciola kuva punto it, 50 
euro/ora + IVA e ti verrà sistemato il codice spiegandoti tutti i 
problemi che ci abbiamo trovato. Ricordati di specificare indirizzo, 
nome e codice fiscale (o ragione sociale e p.Iva) e il consenso al 
trattamento dei dati personali.
Leggi bene 
http://www.catb.org/~esr/faqs/smart-questions.html
 o la 
versione italiana 
http://xoomer.virgilio.it/army1987k/
 (ma meglio quella 
inglese).
Detto quanto sopra: verifica l'implementazione di elem::insert_value che 
hai postato. Scommetto che non è come volevi che fosse (nota: magari 
sbaglio, non ho letto il tuo codice: mi è solo caduto l'occhio. Se 
l'implementazione è giusta, allora il nome scelto per il metodo è 
opinabile).