Ich versuche ein Programm zu erstellen, das einige Daten aus 2 Dateien lesen kann. Die erste Datei ist der Header, der die Datenstruktur (Dimensionen, Datentyp, Extents usw.) beschreibt, und die zweite sind die Rohdaten.Variable Array-Dimension zur Laufzeit C++
Um verschiedene Datentypen zur Laufzeit zu behandeln, habe ich eine Vorlagenklasse erstellt, die als Container für die Daten verwendet wird. Abhängig vom Datentyp, der im Header gelesen wird, erstelle ich eine spezielle Klasse des Containers, um die Daten zu speichern.
Allerdings habe ich jetzt ein anderes Problem. Wie kann ich zur Laufzeit ein dynamisches mehrdimensionales Array erstellen?
Ich dachte zuerst, es auf altmodische Art und Weise zu tun, und legte einen Zeiger in die Speicherklasse, und einige Schleifen (= zur Dimensionalität) erstellen, um ein neues Array (neues Array [Größe]) zu erstellen. Aber ich denke nicht, dass es eine sehr saubere Art ist, es zu tun.
Ich dachte auch über Stapel std :: vector, aber ich weiß nicht die Dimensionalität vor der Laufzeit.
Dann dachte ich Boost zu verwenden, um ein multi_array zu erstellen, und resize() zu verwenden, um den Umfang meines Arrays zur Laufzeit zu aktualisieren, aber es ist erforderlich, die Dimension beim Erstellen des Arrays zu kennen (multi_array < type, dim> variable) . Da ich in all meiner Klasse (für zukünftige Verarbeitung, etc ...) darauf zugreifen möchte, sehe ich nicht, wie ich das in meiner Klasse einfügen soll, da ich nur die Dimensionalität zur Laufzeit kenne. Ist es möglich, einen Basiszeiger von multi_array in meiner Klasse zu erstellen und später zu deklarieren (wenn ich die benötigte Dimension kenne)?
Oder gibt es einen anderen Weg, dies zu tun? Mein Ziel ist es, zur Laufzeit ein multidimensionales Array zu erstellen, auf das ich in meiner Klasse zugreifen kann.
Vielen Dank.
Bearbeiten: Die meisten der Themen, die ich darüber gelesen habe, sind für feste dimensionale Array, mit einer variablen Größe. Aber in meinem Fall variiert auch die Dimension.
Update: Ihre Antwort inspirierte mich eine Idee Hugues. Ich habe bereits eine Template-Klasse, um die Daten zu lesen, aber für den Moment braucht es nur als Parameter den Datentyp. Ich denke, die dimensionnality ihm hinzufügen und erstellen Sie eine Klasse wie folgt aus: storageClass< data_type, data_dimension > myStorage(filename, data_extent, data_endian, data_encoding);
Auf diese Weise kann ich auch die dimensionnality der Datenvorlage, und erstellen Sie eine multidimensionnal Array (mit boost zum Beispiel). Ich werde Sie wissen lassen, ob es funktioniert hat. Danke.
Update 2: Offenbar ist es nicht möglich, da Templates konstanten Ausdruck erwarten. Ich kann die Variable 'dimension' nicht übergeben (auch wenn es in diesem Fall ein fester Wert ist, aber zur Kompilierzeit nicht definiert ist). Also ich denke, meine beste Option ist ein variadic Getter in der benutzerdefinierten Speicherklasse erstellen und den entsprechenden Wert zurückgeben. Das Problem besteht darin, dass eine variadische Methode das Parsen der Argumente beinhaltet, und da dies eine Methode ist, die häufig aufgerufen wird, ist sie nicht optimal.
Dank. Die Sache ist, dass ich schon alle meine Daten in einem riesigen Puffer (eindimensionales Array) habe, aber jetzt möchte ich sie in einem multidimensionalen Array organisieren, um den Zeiger dieses multidimensionalen Arrays zurückgeben zu können (zB mit getData()) so kann ich leicht auf diese Daten anderswo zugreifen. Eine Lösung wäre, eine variadic Methode in der Speicherklasse zu implementieren, wie 'double getData (x, y, z, c, dim5, dim6, ....)', aber da ich vielleicht auf diese Daten zugreifen kann, ' Ich bin mir nicht sicher, ob es optimal ist, es so zu machen. Ich würde lieber einen Zeiger auf das Array zurückgeben und so zugreifen 'd = storage.getData(); Wert = d [0] [0] [0] ... ' – whiteShadow