Probleme mit static library

Der Wolf

Erfahrenes Mitglied
Hallo,

folgendes Problem.

Ich schreibe gerade für eigene Zwecke eine ganz simple Datenbank-Bibliothek ... und ich bin da gerade erst wirklich ganz am Anfang.
Die Bib soll aus 4 Klassen bestehen. Ich habe das ganze unter Eclipse entwickelt und beim compilieren und ausführen kommen auch keinerlei Fehler. Aber irgendwie führt er die Funktionen auch nicht bis zum Ende aus. :mad:
Wenn ich die Library in ein anderes Porgramm einbinde und mit der von mir implementierten Funktionen eine Datei öffnen lasse, so wird das Programm bis zu einer bestimmten Stelle ausgeführt und dann anscheinend abgebrochen, aber ohne eine Meldung warum.

Code:
void DatabaseManager::makeDatabase(char line[1024]) {
	
	// Meta DB-Info contains max 3 informations
	// The robot, which collects the data
	// The sensors used to collec the data
	// Some further Information
	char *robot;
	char *sensors;
	char *temp;
	char *furtherInfo;
	
	// All meta informations are split by |. Parse them and create
	// new Database with this meta informations
	robot = strtok(line, "|");
	for (int i = 0; i < 2; i++) {
		temp = strtok(0, "|");
		if (i == 0) {
			sensors = temp;
		}
		if (i == 1) {
			furtherInfo = temp;
		}
	}	
	std::cout << "Testfsdf" << std::endl;
	Database *base = new Database(robot, sensors, furtherInfo);
	openDatabases.push_back(base);
        std::cout << "Verflixt und zugenäht" << std::endl;

	
}

Das Testfsdf wird ausgeben, aber mehr passiert irgendwie nicht. In dem Construktor für das Database-Objekt stehen auch noch std::cout Anweisungen drin, aber die werden ebenso wenig ausgeführt wie cout Anweisungen nach dem push_back().

Vielen Dank schonmal im Vorraus
Der Wolf

P.S.: Das ist das erste mal das ich versuche eine eigene Bibliothek zu schreiben ^^
 
Die for() Schleife liest alle Einträge und überschreibt jedesmal den Vorherigen.
Die Ausgabe folgt erst danach, also bekommst du nur das Letzte was die for() Schleife findet.
 
In wie fern überschreibt die for Schleife etwas? Meinst du die Variable temp? Die kann sie ruhig überschreiben.
Ich habe das Problem auf den Constructor-Aufruf für das Database Objekt vorerst eingegrenzt.
Da scheint zumindest der Hase im Pfeffer begraben zu liegen. Das Objekt soll eigentlich 3 Parameter vom Typ std::string übergeben bekommen, aber irgendwie scheint die Zuweisung eines char* zu einem std::string Schwierigkeiten zu machen, dabei müsste laut allen möglichen Quellen ich eigentlich das so schreiben können.
char *temp = "Pioneer3";
std::string temp2;

temp2 = temp;

Aber teilweise bekomme ich da einen ACCESS_VIOLATION Fehler. Oder halt auch garkeine Meldung.
 
Die Schleife überschreibt dir in jedem Durchlauf den Inhalt von "sensors" und "furtherInfo", sprich wenn strtok als Letztes einen NULL Eintrag findet, weil das letzte Zeichen ein | ist, dann ist das Ganze bei Ausgabe leer.
 
Ehm vergleich bitte die Runtime Bibliotheken -Versionen ... die Heapmanager können sich unterscheiden.
 
Das hat mit der IDE gar nichts zu tun, das ist rein logisch

Code:
robot = strtok(line, "|");    // liest den ersten Eintrag im string

	for (int i = 0; i < 2; i++) {     // Schleife ist überhaupt nicht nötig, siehe unten
	
	temp = strtok(0, "|");   // liest im ersten Schleifendurchlauf den zweiten Eintrag im string, im zweiten Durchlauf den dritten Eintrag

		if (i == 0) {
			sensors = temp;  // kopiert Eintrag 2 
		}
		if (i == 1) {
			furtherInfo = temp;  // kopiert Eintrag 3
		}
	}	

	Database *base = new Database(robot, sensors, furtherInfo);  // Hier entspricht robot immer Eintrag 1, sensors Eintrag 2 und furtherInfo Eintrag 3

Übersichtlicher, ohne Schleife, macht er genau das Selbe mit:

Code:
robot = strtok(line, "|");
sensors = strtok(0, "|");
furtherInfo = strtok(0, "|");

Noch einfacher:

Code:
Database *base = new Database(strtok(line, "|"), strtok(0, "|"), strtok(0, "|"));

Auf eine Zeile gekürzt dürfte sich dann auch leicht rausfinden lassen, wo der Fehler liegt.
Ansonsten lässt du dir mit std::cout mal die eingelesenen Variablen ausgeben und schaust, ob überhaupt gültige Werte in "line" stehen.
 
Der Fehler lag wohl darin das ich von *char nach std::string umgewandelt habe ... keine Ahnung warum da das Problem lag, aber wenn man eine Zeile in einer Datei gleich als std::string einlesen lässt und nicht als char[] oder *char tritt der Fehler nicht mehr auf.
 
Zurück