Mehrdimensionales Array als Rückgabewert
-
Hallo,
ich habe im Moment ein nicht sehr schönes Problem
Und zwar habe ich eine Klasse "Parser" mit der Funktion "parsing", diese soll ein zweidimensionales Array zurück an meine main Funktion geben.
In der Main wird dann das Array verarbeitet.Mein Ansatz sah so aus:
uint16_t* parsing(void){ uint16_t arr[255][3]; uint16_t mbuff; uint8_t buff; std::ifstream file; file.open("xyz.bin", std::ios::binary | std::ios::in); while(!file.good()){ for(z = 0; z < 3; z++){ buff = file.get(); mbuff = (buff << 8); buff = file.get(); mbuff = mbuff | buff; arr[i][z] = mbuff; } i++; } file.close(); int *t = new int[i+1][3]; while(i >= 0){ for(z = 0;z < 3;z++){ t[i][z] = arr[i][z]; } i++; } return t;
Jedoch bekomme ich jetzt von meinem Compiler (GCC) folgenden Fehler:
g++ -c -std=c++0x -O2 main.cpp Collision.cpp Parser.cpp
Parser.cpp: In member function ‘uint16_t* Parser::parsing()’:
Parser.cpp:49:36: error: cannot convert ‘uint16_t ()[3] {aka short unsigned int ()[3]}’ to ‘uint16_t* {aka short unsigned int*}’ in initialization
Parser.cpp:52:13: error: invalid types ‘uint16_t {aka short unsigned int}[int]’ for array subscriptHat jemand eine Idee, was ich falsch gemacht habe?
Danke
MfG,
derFerEdit:
uint16_t und uint8_t sind nötig, weil ich sicher gehen muss, dass nur 16Bit gelesen werden / 8 Bit.
Und int und short sind ja je nach System unterschiedlich (können unterschiedlich sein).
-
1. Lerne, wie man in C++ Daten liest und zwar aus einem Buch, dessen Autor nicht einfach versucht hat, C nach C++ zu übersetzen. Deine Zeilen 6-17 kannst du komplett vergessen.
2. Benutze std::vector für Arrays dynamischer Größe. Schmeiß das Lehrwerk weg, aus dem du die Idee bekommen hast, dafür new zu benutzen.
3. Du kannst zwar keine Arrays in einen std::vector packen (da Arrays nunmal komische Sonderregeln haben), dafür gibt es aber std::array (in älteren Compilern std::tr1::array).
4. Mit 2. und 3. ist das was du vor hast ein Kinderspiel. Ohne wird das frickelig.
5. Überhaupt scheint dein Lehrbuch dir sehr, sehr schlechten Stil beizubringen. Ich könnte noch viel mehr aufzählen, das oben ist bloß das wichtigste. Mit diesem Stil wirst du später noch viel mehr Ärger haben. Womit lernst du?
-
naja ist doch klar.
du willst erstens hier
int *t = new int[i+1][3];
ein 2Dim Array an einen int zeiger geben
und dann hier
uint16_t* parsing(void){ // ... return t;
einen zeiger auf ein 2Dim int array als uint16 zeiger zurückgeben
tipp 1 (empfehlenswert): nimm std::vector
tipp 2 (nicht empfehlenswert): wandel mindestens das uint16 in int um...
-
Hallo,
@SeppJ:
Ok, zu 1:
Hab das jetzt mal umgeändert (ein Bisschen Refferenzen gelesen):char* FileBuffer; std::ifstream file("xyz.bin", ios::in|ios::binary); FileBuffer = new char [file.tellg()]; file.seekg (0, ios::beg); file.read (FileBuffer, file.tellg()); file.close();
Besser?
Zu 2:
Die Idee habe ich aus dem Internet
zu 5: Siehe 2Skym0sh0 schrieb:
tipp 1 (empfehlenswert): nimm std::vector
tipp 2 (nicht empfehlenswert): wandel mindestens das uint16 in int um...Also zu 2: Ist ein Fehler, in meinem Code steht
uint16_t *t = new uint16_t[i+1][3];
Auf jeden Fall danke an euch beide
Werde mir jetzt erst mal std::vector angucken.
MFG
-
Hol dir ein Lehrbuch! Dringend! Internet ist das schlimmste was du tun kannst, wenn es um die Grundlagen geht! Guck dir mal den zweiten Link in meiner Signatur an. Das Buch "Thinking in C++" gibt es auch als gratis Ebook, falls es am Budget scheitern sollte. Jedenfalls ist dein Code bloß eine weitere Bestätigung, dass Internettutorials nichts taugen.
Besser?
Nicht sehr. Siehe den Anfang dieses Beitrags. Vor allem macht es etwas völlig anderes als dein vorheriger Code. Nun bin ich mir nicht sicher, ob du dies selbst bemerkt und bewusst verbessert hast oder ob du einfach nicht besser weißt, was die Unterschiede sind, da dir die Grundlagen fehlen.
-
std::vector<std::array<unsigned short,3>> load() { using std::vector; using std::array; vector<array<unsigned short,3>> v; ... while (...) { ... array<unsigned short,3> a; ... v.push_back(a); ... } ... return v; }
-
@SeppJ: Ok ich habe mir jetzt ein Buch besorgt
Denke mal das es was taugt ("Der C++ Programmierer").
@krümelkacker: Danke, funktioniert!
Aber ich habe noch eine kurze Frage:
Soweit ich es überschaue, sind die Unterschiede zwischen Vektor und List folgende:
Vector ist ähnlich einem Array (lässt sich mit dem []Operator ansteuern, aber dafür ist er recht langsam wenn man Elemente entfernt.
List kann man nicht mit dem []Operator benutzen, aber ist dafür sehr schnell beim Löschen.Jetzt habe ich die Frage, was ist besser List oder Vector?
Benutzt wird es um die "Gegner" in einem kleinen Spiel zu speichern, also es erfolgen schon einige Lösch-Aufrufe.
Und eigentlich brauche ich den []Operator nicht, da ich Elemente in der List/Vector in einer for-Schleife (mit Iterator) durch gehe (Kollisionserkennung) und dann wenn benötigt lösche.Eigetlich wäre doch List am besten, oder?
DANKE
-
derFer schrieb:
@SeppJ: Ok ich habe mir jetzt ein Buch besorgt
Denke mal das es was taugt ("Der C++ Programmierer").
@krümelkacker: Danke, funktioniert!
Aber ich habe noch eine kurze Frage:
Soweit ich es überschaue, sind die Unterschiede zwischen Vektor und List folgende:
Vector ist ähnlich einem Array (lässt sich mit dem []Operator ansteuern, aber dafür ist er recht langsam wenn man Elemente entfernt.
List kann man nicht mit dem []Operator benutzen, aber ist dafür sehr schnell beim Löschen.Jetzt habe ich die Frage, was ist besser List oder Vector?
Benutzt wird es um die "Gegner" in einem kleinen Spiel zu speichern, also es erfolgen schon einige Lösch-Aufrufe.
Und eigentlich brauche ich den []Operator nicht, da ich Elemente in der List/Vector in einer for-Schleife (mit Iterator) durch gehe (Kollisionserkennung) und dann wenn benötigt lösche.Eigetlich wäre doch List am besten, oder?
DANKE
List ist nicht sehr Performant. Bjarne Stroutrup hat da mal einen Graphen gehabt, der gezeigt hat wie sich die verhalten: http://bulldozer00.files.wordpress.com/2012/02/vector-list-perf.png
-
Ah ok, danke.
Ich hatte meine Informationen hier her: http://cplus.kompf.de/artikel/vectorlist.html
Also ist Vector doch performanter...
Ok... MfG,
Fer
-