Rausschreiben mehrerer Container mit nur einer Schleife.

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Muckl
Beiträge: 23
Registriert: 12. April 2011 15:21

Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Muckl »

Hi,
ich möchte gerne die Inhalte von 2D Feldern zusammen in eine Textdatei schreiben. Dies sollte gerne modularisiert passieren und die Anzahl der Felder sowie deren Name sollte möglichst variabel sein.
ich habe dann z.B. eine Methode mit Schleife

Code: Alles auswählen

void writeData(QVector<QVector<double> > & feld)
for(int i=0; i<feld.size(); i++)
{
   for(int j=0; i<feld.value(0).size(); j++)
     {
        stream<<feld[i][j]<<" ";
}
stream<<endl;
Nun ist meine Anzahl an Feldern jedoch auf 1 begrenzt. Ich kann natürlich anstelle eines Feldes auch zwei drei oder vier Felder übergeben und dann so viele Schleifen in die Methode einbauen, wie ich Felder habe. Aber so richtig zufrieden bin ich damit nicht. Erstmal müsste es doch auch mit einer Schleife klappen und die Anzahl der Felder wäre auch nciht variabel. Ich könnte doch als Argument einen QVector<QString> übergeben, welcher die Namen der Variablen oder die Referenz zu dieser enthält und die er dann einmal in der Schleife durcharbeitet. Geht das überhaupt, ist das sinnvoll oder gibt es bessere Lösungen? Ich weiß dabei nämlich nicht, wie ich von der Variablen, dessen Adresse im übergebenen Vector gespeichert ist, eine Methode wie .value() aufrufe. Zusätzlich stelle ich mir die Frage, ob man Variablennamen "dynamisch" deklarieren kann. z.B eine Deklaration, bei der der letzte Buchstabe des Namens ein Platzhalter ist und dann z.B. in einer Schleife so viele Variablen deklariert werden, wie man möchte. Leider weiß ich nicht, wie man einen beliebigen std::String oder QString in den variablennamen einbaut.

Vielen Dank,

MAlte
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Mr.Crank »

Tach Malte,

grundsätzlich kann ich leider deine Problematik aus dem Text nicht heraus lesen, es fehlen auch einfach zuviel Hintergrundinfos deiner Aufgabenstellung.
Desweiteren verstehe ich nicht warum du für einen Text ein 2DVec benötigst, wenn es ein QString doch auch tut und dazu noch nützliche Funktionen mitbringt.

Eine Ausgabe einer 2D Matrix beinhaltet auch 2 Schleifen, du musst ja einmal in x und einmal in y Richtung wandern.

Möchtest du also mehrere Texteingaben von Tastatur speichern, so würde ich mit QString arbeiten. Diese würde ich in einem vector<QString> completeText;
mit push_back packen, dabei lässt du pro push_back den Iterator auch ein weiter wandern und fertig.

Gruß Mr.Crank

P.S. vieles lässt sich aus C++ ableiten, also garnicht so Qt spezifisch denken
Muckl
Beiträge: 23
Registriert: 12. April 2011 15:21

Re: Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Muckl »

Hi Mr. Crank,

danke für die Antword. Ja, meine Beschreibung war etwas konfuse. Eigentlich waren es zwei Problemstellungen. Ich versuche es nochmal etwas ausführlicher. Ich habe sechs mal einen 2D Array vom Typ QVector<QVector<double> >, welcher verschiedenen Messdaten für einen Schiffstypen ethält. Insgesamt habe ich drei verschiedenen Schiffstypen. Diese sechs 2D Arrays jedes Schiffs sollen nun jeweils in eine Textdatei geschrieben werden, so dass drei Textdatein entstehen, die jeweils 6 2D Felder enthalten. Anfangst habe ich für jedes Feld eine Schleife gemacht. Ich habe dann relativ schnell gemerkt, dass das nicht wirklich klever ist, da später sehr wahrscheinlich noch mehr Felder hinzu kommen. Um die Arbeit etwas zu reduzieren habe ich dann die 2D Felder in ein 3D Feld geschrieben. So ist für jedes Schiff ein 3D Feld entstanden und ich brauche die benötigte Dreifachschleife nur ein mal für jedes Schiff schreiben. Im Grunde löst das aber nicht wirklich mein Problem. Wenn es nun mehr Schiffe werden muss ich entweder wieder mehr Schleifen schreiben oder ich speicher die 3D Felder in ein 4D Feld und gebe dann dieses 4D Feld aus. Das macht es aber nicht übersichtlicher. Noch größer wird mein Problem, wenn ich erst zur Laufzeit weiß, von wie vielen Schiffen ich Messdaten habe. Und dass führt dann zu meiner zweiten Frage, ob man während der Laufzeit Variablen deklarieren kann. Ich stelle mir da folgendes vor. So wie mein Beispiel wird es nicht fuktionieren, aber vom Prinzip her vielleicht. Er soll automatisch eine Anzahl von double Variablen erzeugen, die die Bezeichnung von 1 bis 10 haben.

Code: Alles auswählen

for (int i=1; i<10; i++)
{
   doubel "i"=5*i;
}
Gibt es da eine Möglichkeit?

Gruß, Malte
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Mr.Crank »

Tach Malte,

okay nun wurde es klarer ;) , trotzdem verstehe ich immer noch nicht wozu du für eine Messreihe ein 2D Vector brauchst. An deiner Stelle würde ich mir
vorher nochmal Gedanken über die Programmstruktur machen.

Klar kann man alles Variabel halten mit Templates und der gleichen. Variable zur Laufzeit erzeugen ist nicht immer ganz trivial, QVector ist hier eine Möglichkeit.
Wobei ich in deinem Fall befürchte das hier nur eine Klasse existiert und auch paar c++ Basics fehlen ;)

Ich würde deine Problematik wie folgt angehen:
Problematik 1:
Du willst Variable eine beliebe Anzahl an Schiffstypen erzeugen können.
-> Dann bietet sich hier eine separate Klasse an class shipType
shipType enthält jetzt Methoden um Schiffe, also class ship Objekte hinzuzufügen und zu löschen.
-> hier nutzt man für gewöhnlich list<class>countShip , diese bietet wie vector eine sequenzielle Sortierung aber kein direkt Zugriff. (brauchst du auch nicht)
-> ebenfalls enthällt die Klasse also shipType eine Methode zur Ausgabe der Messwerte eines Schiffs in der Liste
ggf. kannst du hier Vererbungsstrukturen einbauen um dir Tipparbeit zu sparen

Problematik2:
class ship
hier definierst du nun die Parameter welche du benötigst, du möchtest eine Double Messreihe via Tastatur eingeben oder auslesen wie auch immer
->QVector<double> measuredData;
Wozu 2D ? du eine Messreihe ist 1 dimensional für mich. (Speicherplatzkiller ;) )
Für die Messdaten musst du nun eine Funktion schreiben welche diese in dein Vector schreibt.


Leider kann ich dir nicht genau helfen und direkt den Code schreiben, das würde den Sinn diese Forum überschreiten und dann müsste ich das ganze Programm
und die Problematik kennen.
Ich denke du solltest dir Gedanken über deine Struktur machen und nicht so viel in eine Klasse packen, dafür gibt es in Qt die C++ Basics wie Vererbung Polymorphie usw..

Hoffe es hilft dir trotzdem diese Anregung

Lg Mr.Crank
Muckl
Beiträge: 23
Registriert: 12. April 2011 15:21

Re: Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Muckl »

Hi,
oh schnelle Antwort, vielen Dank. Achso, der 2D Array. Ja, also die Messwerte hängen von zwei Parametern ab. z.B. Geschwindigkeit des Schiffs abhängig von der Windgeschwindigkeit und der Windrichtung. Deswegen der 2D Array. Ich habe es nun auch so gemacht, dass ich eine Klasse "Schiff" erstellt habe und davon so viele Instanzen erstellt habe, wie Schiffe existieren. Ich verstehe leider nciht ganz deine Beschreibung, wie ich nun zur Laufzeit Instanzen dieser KLasse erzeuge. Wenn z.B. sämtliche Messdaten aller Schiffe in einer Textdatei abgespeichert sind, dann merkt das Programm erst beim Einlesen und Parsen der Daten, wie viele Schiffe benötigt werden. Die einzige Möglichkeit die ich wüsste wäre, dass ich ein Feld QVector<Schiff> feldSchiff erzeuge und einen Pointer "Schiff *meinSchiff". Im Programm erstelle ich dann mit "aktuelleSchiff=new meinSchiff()" eine Variable , auf die mein Pointer zeigt und führe dann alle Berechnungen durch, speicher sämtliche Werte in den dafür vorgesehenen 2D Feldern und wenn alles für das erste Schiff durchgeführt wurde, mache ich feldSchiff.appand(aktuelleSchiff). Dann lösche ich mit "delete aktuelleSchiff" das erste Schiff und mache den selben kram so lange in einer Schleife, bis keine Schiffe mehr da sind. Dabei ist natürlich etwas blöde, dass die Daten aus der eingelesenen Datei immer an das "aktuelleSchiff" übergeben werden müssen. Aber im Grunde ist dann ja zur Laufzeit noch nciht klar, wie groß "QVector<Schiff> feldSchiff" eigentlich wird, was ja irgentwie einer Erstellung von Variablen zur Laufzeit entspricht. Kann ich denn nur innerhalb eines Feldes zur Laufzeit Variablen erstellen oder gibt es auch eine allgemeine Lösung?

Gruß, Malte
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: Rausschreiben mehrerer Container mit nur einer Schleife.

Beitrag von Mr.Crank »

In der objektorientierten Programmierung sind Variablenerzeugung zu Laufzeiten ganz normal ,wie sonst will man z.B. Konto Kunden oder der gleichen verwalten ;)
Der Ansatz Objekte in Vektoren oder Listen zu packen ist also gang und gebe. Für deine Zwecke wird es funktionieren und ist auch sicher ausreichend.

Wenn du dynamische Objekte erzeugen willst such mal nach Factory Methode C++, deine Erzeugung via new Konstruktor ist ein Teil dieses Verfahrens.

Ich würde eine Map anlegen so kannst du später mit cSchiff 1 cSchiff 2 zugreifen:
include <map>
using namespace std;
typedef map < int, Schiff*> SchiffMap;
SchiffMap createdSchiffMap;
//createdSchiffMap ist jetzt die Map

//Einügen:
Schiff* cSchiff = new Schiff;
int iNummer = ...;
createdSchiffMap.insert(map< int, Schiff*>::value_type(iNummer, cSchiff));
//Suchen via Iterator
SchiffMap::iterator pItr = createdSchiffMap.find(iNummer);
cSchiff = (Schiff*)(*pItr).second;
//löschen eines Schiffs
createdSchiffMap.erase(pItr);
//löschen der map:
cSchiff.clear();

Wahrscheinlich hat dich das jetzt voll rausgehauen, schreib mir einfach ma eine PM wo es genau harkt.Wenn es garnicht geht nehme ich
mir am Feiertag mal Zeit und gucke das Programm an ;)

Gruß Mr.Crank
Antworten