Array von Pointern
-
Hi,
ich verwende eine Klasse QFile. Diese Klasse kann wie folgt verwendet werden:
QFile* singleFile; singleFile = new QFile; singleFile->setFileName("singleFile.txt"); singleFile->open(QIODevice::WriteOnly); //...Dies Funktioniert soweit auch. Für mein aktuelles Projekt brauche muss ich mehrere Dateien gleichzeitig öffnen. Dazu möchte ich ein Array dieser QFiles verwenden. Ich hatte mir das so vorgestellt:
QFile **file; file=new QFile*[10]; for (int c=0; c<10; c++) file[c]=new QFile(); //ID ist eine Zahl zwischen 0 und 9 file[ID]->setFileName(filename); //***hier bleibt das Programm hängen file[ID]->open(QIODevice::WriteOnly);Diese version läßt sich kompilieren ohne Fehler und Warnungen. Zur Laufzeit bleibt das Programm an der im Code gekennzeichneten Stelle hängen.
Meine Frage: Ist die Deklaration von file** richtig? Ist file[ID]->someFunction() ein richtiger Aufruf?
Hat jemand eine Idee, warum das Programm sich aufhängt?
Gruss, Karl
-
KarlBlau schrieb:
Meine Frage: Ist die Deklaration von file** richtig?
ja
KarlBlau schrieb:
Ist file[ID]->someFunction() ein richtiger Aufruf?
ja
KarlBlau schrieb:
Hat jemand eine Idee, warum das Programm sich aufhängt?
zeig mal mehr Code
-
Definiere "Aufhängen"
Absturz? Wenn ja, Fehlermeldung(en)? Oder "reagiert nicht mehr"?Was ist fileName an der "Aufhängstelle"?
-
Hi, ich habe ein paar Dinge verändert. Jetzt bekomme ich eine Fehlermeldung, die weiterhelfen könnte.
QString filename; filename = "test.txt"; ID=1; file[ID]->setFileName(filename); std::cout << "filename: " << (file[ID]->fileName()).toStdString() << std::endl; file[ID]->open(QIODevice::WriteOnly | QIODevice::Text);Ausgabe ist dann:
filename: test.txt
QFSFileEngine::open: No file name specified
Das Programm läuft weiter, aber macht natürlich nicht das, was es soll.Das ist doch merkwürdig, denn eine Zeile vor open() bekomme ich noch den richtigen Dateinamen ausgegeben.
Ich verwende QT4 für Windows.
Gruss, Karl
-
versuch mal so was:
int main() { //initialization QFile **file = new QFile*[10]; for (int c = 0; c < 10; c++) { file[c] = new QFile(); } //load files for(int i = 0; i < 10; ++i) { if(QFile::exists(filename)) { file[i]->setFileName(filename); file[i]->open(IO_WriteOnly); } else { std::cout << "file not exist!!!\n"; } } //cleanup for(int i = 0; i < 10; ++i) { delete file[i]; } delete [] file; return 0; }
-
Vielen Dank für die Hilfe.
Jetzt läuft das Ding.Gruss, Karl
-
wenn ich das schon sehe:
QFile **file = new QFile*[10];
wie zu C Zeiten...
wie wäre es mit std::vector<QFile*> ?
oder noch besser:std::vector<std::auto_ptr<QFile*> >Vorteile:
- Keine probs mit Zeigern,
- Keine dtor Aufrufe nötig
- Keine Speicherlagsps: ich weis jetzt nicht mehr ob es std::auto_ptr<> war, programmier schon seit einer Weile mit C#.
-
DEvent du meinst boost::shared_ptr anstatt std::auto_ptr.
-
QFile* singleFile; singleFile = new QFile;geht hier nicht...
QFile singleFile;?
dann wird der vector sogar noch ein bischen einfacher:
std::vector<QFile> file;
-
DEvent schrieb:
std::vector<std::auto_ptr<QFile*> >


All STL containers have copy semantic not reference semantic, means when you insert anything in any STL container then its copy is created and put in the container and the same thing apply when you get something from container. For further information about copy semantic, take a look at Item 3 of Effective STL. But unfortunately the auto_ptr semantic doesn't fulfill the copy requirement of STL container, therefore it is not recommended to use it in container. If you try to do it then you may get unpredictable result, such as some or all of your value of container becomes NULL due to ownership transfer semantic, because we don't know in advance what is the internal working of a particular algorithm.
