Probleme mit Operator<<



  • Hi,
    ich habe folgendes Problem, dessen Grund und Lösung mir nicht klar ist:

    Während des Programmverlaufs befinden sich zwei Objekte A und B einer Klasse auf dem Heap, der Zugriff erfolgt also über Zeiger. Bei der Speicherzuweisung mittels new gibt es keine Probleme. Diese Objekte besitzen jeweils 2 Arrays von Zeigern auf Strings (also char **p), denen ebenfalls per new Speicher auf dem Heao zugewiesen wird. Wenn ich nun mittels Ausgabeoperator << Elemente aus einem der Arrays von B ausgeben möchte (sowohl über cout als auch "fout" (also ofstream)), wird der Speicherinhalt eines Arrays von A überschrieben bzw. genauer der Speicher, auf den die Arrayszeiger zeigen. Wenn ich jedoch mittels printf die Array-Daten von B über die Standardausgabe ausgeben lasse, ist alles in Ordnung.

    Meine Vermutung ist, dass es da Probleme mit dem Buffer gibt, aber keine der errorflags sind gesetzt (überprüfe ich mittels good())....und es nützt auch nichts, wenn ich sofort flush aufrufe....

    Ich hoffe, mir kann da jemand helfen...
    😞



  • bogeyman schrieb:

    Meine Vermutung ist, dass es da Probleme mit dem Buffer gibt,

    Meine Vermutung ist, dass du irgendeinen Unsinn mit dem dynamischen Speicher machst. Die Wahrheit wird wohl für immer verborgen bleiben, wenn du den Code nicht rausrückst.



  • du macht irgendwas in deinem code falsch...
    um zu sehen was genau musst du die relevanten stellen erstmal posten



  • nagut, hier ist der code:

    class CompoundSet{
    	public:
    	Compound **set;		//array of pointers to all compounds in this class	
    	char **descr_list;	//array of pointers to all descriptors
    	char **add_prop_list;
    	int no_c;		//number of compounds in the set
    	int no_descr;		//number of descriptors
    	int no_ap;		//number of additional properties
    
    	CompoundSet();	//constructor
    	CompoundSet(int no_compounds, int t_no_descr, int no_add_prop); //initialise new CompoundSet with no_of_compounds compounds
    
    	~CompoundSet();	//destructor
    };
    

    obige Klasse beinhaltet u.a. untere nachfolgende Klasse...

    class Compound{
    	public:
    	char name[name_length];	
    	double *descr_values;
    	double *add_prop;	
    
    	Compound(char *id, int no_descr, int no_add_prop);
    	~Compound();		//simple destructor
    };
    

    Die Konstruktoren sehen folgendermaßen aus:
    Für CompoundSet:

    CompoundSet::CompoundSet(int no_compounds, int t_no_descr, int no_add_prop){
    	no_c = no_compounds;
    	no_descr = t_no_descr;
    	no_ap = no_add_prop;
    
    	set = new Compound*[no_c];
    	for (int i=0;i<no_c;i++){
    		set[i] = new Compound("",no_descr,no_ap);		
    	}
    	descr_list = new char*[no_descr];
    	add_prop_list = new char*[no_ap];
    }
    

    und für Compound

    Compound::Compound(char *id, int no_descr, int no_add_prop){
    	strcpy(name,id);
    	descr_values 	= new double[no_descr];
    	add_prop 	= new double[no_add_prop];
    }
    

    Soo, in der main() initialisiere ich zunächst ein Objekt der Klasse CompoundSet :

    CompoundSet *ac = new CompoundSet(no_ac,no_descr,no_add_prop);
    

    , klappt auch alles und ich kann damit arbeiten. Das Array, welches mir nachher überschrieben wird, ist übrigens ac->descr_list.
    Später wird eine Methode aufgerufen, die ein Objekt der Klasee CompoundSet erzeugt..

    CompoundSet *tmp_cs = new CompoundSet(1,no_descr,no_add_prop);
    

    ..welches nur ein Objekt der Klasse Compound beinhaltet. Anschließend werden Daten aus einer Datei in tmp_cs->set[0]->name[\b], [b]tmp_cs->set[0]->descr_values[i][\b] und [b]tmp_cs->set[0]->add_prop[0] geschrieben. Soweit, so gut...diese Daten könne mittels printf ausgegeben werden und das vorhin erwähnte Array ac->descr_list enthält noch die korrekten Daten.
    Ebenfalls in dieser Methode wird eine Datei mittels

    ofstream fileOUT;
    fileOUT.open(outputFile);
    if ((void*)fileOUT==0){
    	fprintf(stderr,"failed to open file <%s>\n",outputFile);
    	exit(1);}
    

    zum Schreiben geöffnet. Sobald folgender Code ausgeführt wird...

    fileOUT <<tmp_cs->set[0]->name<<"\t";		//write compound-id and MP-FP to outputFile	
    for (int i=0;i<(no_descr+no_add_prop);i++){
            if (fileOUT.good()){
    		if (i<no_descr)
    			fileOUT <<tmp_cs->set[0]->descr_values[i]<<"\t";
    		else
    		        fileOUT <<tmp_cs->set[0]->add_prop[0]<<"\t";
    	}else
    		printf("\nfileOUT!!!!!!!!!!!!!!!!!!\n");
    	}
    	fileOUT <<"\n";
    

    , steht in ac->descr_list nur noch Müll, wobei die Ausgabe fileOUT <<tmp_cs->set[0]->name<<"\t"; alleine noch keine Probleme verursacht. Versuche ich statt der Ausgabe mittels fileOUT << das ganze mit cout <<, passiert dergleiche Mist. Verwende ich aber printf, ist alles in Ordnung....

    ich hoffe, die Code-Auszüge erleichtern Eure Analyse...auf jeden Fall schonmal Danke für die schnelle Reaktion !

    bogeyman



  • Und wie füllst du descr_list?



  • in einer anderen Methode, in der ich die ausgelesenen Zeilen mittels

    token = strtok(line," ,;\t");
    

    parse und dann so

    cs->descr_list[count_descr++] = token;
    

    zuweise.

    hmmm, sollte ich dann vielleicht lieber statt

    char **descr_list;
    descr_list = new char*[];
    

    lieber sowas wie

    char *descr_list;
    descr_list = new char*[word_length];
    

    machen, also ein Array von Strings fester Länge ??? Warum ist das dann solange gut gegangen ??



  • super, da hatte ich ja eine lange Leitung 😞
    funktioniert jetzt...vielen Dank für die Hilfe !!

    bis dann,

    bogeyman


Anmelden zum Antworten