Hallo Ralf!
Um gleich mal alle Unklarheiten zu beseitigen:
Zum System:
- gcc-2.95
- libxml2 (v 2.4.23)
Mein Code sieht folgendermaßen aus:
// ---------------------
// schueler.h
class sm_schueler {
private:
static int anzahl; // Es steht noch nicht fest, ob ich das brauche, also
// nicht wichtig.
char *name, *vorname;
int schuljahr; // Welche Klasse und welches Halbjahr
public:
sm_schueler();
~sm_schueler();
char* getName();
char* getVorname();
int getSchuljahr();
void setName(const unsigned char*);
void setVorname(const unsigned char*);
void setSchuljahr(int);
};
// ---------------------
// schueler.cpp
#include "schueler.h"
sm_schueler::sm_schueler() {anzahl++;}
sm_schueler::~sm_schueler() {anzahl--;}
char* sm_schueler::getName() {return name;}
char* sm_schueler::getVorname() {return vorname;}
int sm_schueler::getSchuljahr() {return schuljahr;}
void sm_schueler::setName(const unsigned char* n)
{
strcpy(name, (char*)n);
}
void sm_schueler::setVorname(const unsigned char* vn)
{
strcpy(name, (char*)vn);
}
void sm_schueler::setSchuljahr(int s) {schuljahr = s;}
// ----------------------
// dateihandler.h
#include
#include
#include
#include "schueler.h"
class dateihandler {
public:
dateihandler();
~dateihandler();
dateihandler(char*, sm_schueler*);
void oeffne(char*);
private:
xmlDocPtr doc;
xmlNodePtr root, sdaten;
void getXMLschueler(char*, sm_schueler*);
int parseSchuljahr(const unsigned char*);
};
// ----------------------
// dateihandler.cpp
#include "dateihandler.h"
dateihandler::dateihandler() { }
dateihandler::dateihandler(char* dateiname, sm_schueler* s)
{
oeffne(dateiname);
getXMLschueler(dateiname, s);
}
dateihandler::~dateihandler(){ }
/** No descriptions */
void dateihandler::getXMLschueler(char* dateiname, sm_schueler* s){
int i=0;
if(!doc->root || xmlStrcmp(doc->root->name, (const xmlChar*) "schuelerdaten"))
{
fprintf(stderr, "\nFehler\n%s", dateiname);
return;
}
sdaten = doc->root->xmlChildrenNode->xmlChildrenNode;
while(sdaten != NULL)
{
s[i].setName(xmlGetProp(sdaten, (const xmlChar*)"name"));
s[i].setVorname(xmlGetProp(sdaten, (const xmlChar*)"vorname"));
s[i].setSchuljahr(parseSchuljahr(xmlGetProp(sdaten, (const
xmlChar*)"schuljahr")));
char *name = s->getName();
char *vorname = s->getVorname();
int schuljahr = s->getSchuljahr();
fprintf(stderr, "%d %s, %s [.] : %d\n", nummer, *name, *vorname, schuljahr);
// Hier verreckt das Programm zur Laufzeit. Ich weiß aber leider nicht,
// woran es liegt. Laut backtrace (KDE-Crashmanager) liegt der Fehler aber
// in fprintf() ...
// Dazu unten mehr.
sdaten = sdaten->next;
}
}
void dateihandler::oeffne(char* dateiname){
doc = xmlParseFile(dateiname);
if (doc == NULL)
{
fprintf(stderr, "Die Datei %s konnte nicht geöffnet werden.", &dateiname);
xmlFreeDoc(doc);
return;
}
root = xmlDocGetRootElement(doc);
if (root == NULL)
{
fprintf(stderr, "Datei leer oder nicht XML-formatiert. %s", &dateiname);
}
}
int dateihandler::parseSchuljahr(const unsigned char* s){
int parsed;
switch((char)s[1])
{
case '1': parsed = 0; break;
case '2': parsed = 2; break;
case '3': parsed = 4; break;
}
if ((char)s[3] == '2') { parsed++; }
return parsed;
}
// ----------------------
// main.cpp:
#include "schueler.cpp"
#include "dateihandler.cpp"
sm_schueler schueler[100];
int main(int argc, char *argv[])
{
dateihandler *schuelerdatei = new dateihandler((char*)
"/home/christian/programmieren/XML/Schülerdaten2.xml", schueler);
return 0;
}
So.
Nehmt mir bitte nicht übel, dass ich die alten Beiträge ganz rausgenommen
hab'. Es wird sonst brutal unübersichtlich.
Also, so wie da oben sieht der wesentliche Teil meines Codes aus.
Es sind 5 Dateien.
Beim Compilieren kommen so keine Fehler. Die kommen immer während
der Laufzeit.
Folgendes für "sm_schueler schueler[100]" in main.cpp:
Ich brauche ein Array, das insgesamt bis zu 100 Schüler
speichern können soll (am besten unbegrenzt viele) und auf
dessen Elemente ich dann noch Zugriff haben will.
Danke,
Christian
--
Chicago Transit Authority Rider's Rule #84:
The CTA has complimentary pop-up timers available on request
for overheated passengers. When your timer pops up, the driver will
cheerfully baste you.
-- Chicago Reader 5/28/82