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

    [C++] inspiegabile segmentation fault

    ciao a tutti,
    ho un piccolo (grande) problema con l'esecuzione di codice C++, sono su linux e utilizzo GCC.
    in pratica nel codice io inserisco all'interno di una mappa un elemento contenente una stringa ed un oggetto di una classe da me creata

    ... ps_power_module:ower_module_table.insert(std:air<string,ps_power_module_struct>(name, ps_power_module_struct(name)));
    ...
    dove power_module_table è un oggetto map statico della classe ps_power_module. inserendo del debug testuale all'interno de codice vedo che costruisce tutto l'oggetto ps_power_module_struct presente all'nterno della mappa, ma non arriva mai al passo successivo dando "segmentation fault", ma questo errore non viene dato quando si accede a locazioni di memoria non utilizzabili????

    grazie a tutti!!!


    Marco
    warcomeb - IL LEADER O.O.O.

  2. #2

  3. #3
    grazie per l'interessamento innanzitutto.
    allora io ho questa funzione

    codice:
    void ps_configure_module::insert_data(void)
    {
    	map_struct_iterator = ps_power_module::power_module_table.find(name);
    
    	if(map_struct_iterator != ps_power_module::power_module_table.end())
    	{
    		cout << "modulo gia presente" << endl;
    
    		map_struct_iterator->second.add_operator(operator_type, data_type, model,parameter);
    	}
    	else
    	{
    
    		cout << "modulo nuovo1" << ps_power_module::power_module_table.size()<< endl;
    
    ps_power_module::power_module_table.insert(std::pair<string,ps_power_module_struct>(name, ps_power_module_struct(name)));
    
    		cout << "modulo nuovo2" << endl;
    
    		map_struct_iterator = ps_power_module::power_module_table.find(name);
    
    		cout << "modulo nuovo3" << endl;
    
    		map_struct_iterator->second.add_operator(operator_type, data_type, model,parameter);
    	
    	}
    
    };
    e l'esecuzione da segmentation fault prima di stampare "modulo nuovo2". il costruttore di ps_power_module_struct è il seguente:
    codice:
    ps_power_module_struct::ps_power_module_struct(string name):module_name(name)
    {
    
    	cout << "ps_power_module_struct1" << endl;
    
    
    	add_default_operator();//aggiungo gli operatori di default
    
    	cout << "ps_power_module_struct4" << endl;
    
    };
    
    void ps_power_module_struct::add_default_operator(void)
    {
    	unsigned int tmp_int = 0;
    	string tmp_string;
    
    	cout << "ps_power_module_struct2" << endl;
    
    
    	//aggiungo qui alla mappa i valori di default tipo "other &", "other |" con modello per la potenza il "costant"
    	for(tmp_int=0 ; tmp_int < (sizeof(operator_possible)/sizeof(operator_possible[0])) ; ++tmp_int)
    	{ 
    		tmp_string = "other " + operator_possible[tmp_int];
    
    	cout << "ps_power_module_struct3" << endl;
    		
    		model_operator.insert(std::pair<string,ps_power_model*>( tmp_string, get_power_model(0)) );
    		
    	};
    
    };
    come ho detto nell'altro post power_module_table è un oggetto di tipo std::map statico della classe ps_power_module.
    lui stampa tutto compreso "ps_power_module_struct4" quindi la costruzione va a buon fine, giusto??


    grazie per l'aiuto


    Marco
    warcomeb - IL LEADER O.O.O.

  4. #4
    Penso tu debba postare il codice completo, ridotto ai minimi termini, compilabile.

    Togli i ";" dopo le graffe di chiusura delle definizioni dei metodi e delle chiusura del ciclo "for" in "void ps_power_module_struct::add_default_operator"

  5. #5
    purtroppo postare codice compilabile è impossibile, il mio programmino si rifa ad una libreria dove sono contenuti quei metodi che ho postato, e la libreria è costituita da più di 200 file.

    comunque mentre vaneggiavo una santa persona mi è venuta in soccorso e dopo due ore di smattimento ci siamo accorti che stavo utilizzando all'interno del costruttore di un oggetto statico, membro di un'altra classe (ps_power_module), un altro oggetto statico (la mappa in cui falliva l'insert) di questa medesima classe (ps_power_module). Essendo random l'inizializzazione dei membri statici la mappa veniva utilizzata senza essere stata prima inizializzata!!!!!!
    Ho risolto inserendo all'interno della classe ps_power_module questo:
    codice:
    std::map<string,ps_power_module_struct> & get_table(){
    static std::map<string, ps_power_module_struct> table;
    return table;
    così quando mi serve la mappa, anche se non è stata inizializzata, chiamando questa funzione essa rimane statica e se è la prima volta viene inizializzata.

    un trucchetto forse non bello a vedersi, che assomiglia molto al Singleton Pattern che si utilizza in JAVA, ma che mi ha salvato molte notti insonni!!!!!!
    spero che il mio smattimento eviti notti insonni a qualcun'altro!!!!!!


    grazie ancora a tutti per l'interesse...


    Marco
    warcomeb - IL LEADER O.O.O.

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.