Return eines zweidimensionalen integer Arrays
-
Ok, beim Erstellen eines demonstrierenden Beispiels ist mir aufgefallen, dass wenn das ganze außerhalb der Klassendefinition steht, einwandfrei funktioniert. Danke.

-
de4dtronic schrieb:
Ok, beim Erstellen eines demonstrierenden Beispiels ist mir aufgefallen, dass wenn das ganze außerhalb der Klassendefinition steht, einwandfrei funktioniert. Danke.

Wie bei jeder anderen Klasse auch. Du kannst schließlich in der Klassendefinition keinen Konstruktor angeben, dieser gehört in die Initialisierungsliste. Einzige Ausnahme sind static Elemente von einfachen Datentypen, wobei ich jetzt so auswendig weiß, ob das Standard oder Compilerfeature ist.
-
class foo { public: inline int const (*func() const)[2] { return values; } private: int values[100][2]; };Natürlich ist das mit einem Typedef deutlich übersichtlicher:
class foo { public: typedef int const (*foo_t)[2]; inline foo_t func() const { return values; } private: int values[100][2]; };
-
So jetzt bin ich immerhin so weit, dass das ganze kompiliert. Allerdings mehr auch nicht: Segmentation fault.
Ich wette, ich habe wieder einige wirklich dumme Fehler drinne, wäre nett wenn nochmal jemand kurz drübergeht.
Ich packe das jetzt einfach mal übersichtlich der Reihe nach in ein Code-Tag. Mir ist klar, dass einiges noch sehr unelegant gelöst ist, aber es geht erstmal darum dass das funktioniert.

Also hier der Code, nicht kompilierbar, dafür übersichtlich:
std::vector< std::vector<int> > Scan::doScan() { std::vector< std::vector<int> > rtrn(100, std::vector<int>(2)); do { entry = readdir(hdir); if (entry) { if (strstr(entry->d_name, type) != NULL) { rtrn[pos_rtrn][0] = getLine("'/^Name=/!d'", entry->d_name, directory); rtrn[pos_rtrn][1] = getLine("'/^Exec=/!d'", entry->d_name, directory); pos_rtrn++; } } } while (entry); closedir(hdir); rtrn[99][1] = pos_rtrn; return rtrn; } // ---------------------------------- std::vector< std::vector<int> > entrys = scanAutostarts.doScan(); int entrys_num = entrys[99][1]; int i = 0; for(int i; i < entrys_num; i++) { rl->pushBack(refListStore, liststore, true, toStr(entrys[i][1]), toStr(entrys[i][2])); }Danke schonmal, ihr seid super

-
int i = 0; for(int i; i < entrys_num; i++)Doppelt ist schlecht. Lieber einmal richtig, und zwar innerhalb
for.Ach ja, und Arraygrössen solltest du auch noch beachten.
-
Nexus schrieb:
int i = 0; for(int i; i < entrys_num; i++)Doppelt ist schlecht. Lieber einmal richtig, und zwar innerhalb
for.Ach ja, und Arraygrössen solltest du auch noch beachten.
Hmm, ich sage ja dumme Fehler.

In diesem Fall gibt es den Array nur mit [>99][0|1], stimmt das soweit? Den pushBack-Aufruf habe ich abgeändert, denke mal das war das einzige.Funktioniert leider immer noch nicht, weiter Ideen?

-
Code zeigen. Ich bin mir nicht sicher, ob du die Fehler richtig korrigiert hast.
-
SeppJ schrieb:
Code zeigen. Ich bin mir nicht sicher, ob du die Fehler richtig korrigiert hast.
for(int i = 0; i < entrys_num; i++) // und rl->pushBack(refListStore, liststore, true, entrys[i][0], entrys[i][1]);
-
std::string Scan::toStr(int var) { std::ostringstream tmp; tmp << var; return tmp.str(); }Du mußt die toStr in den Namensraum deiner Klasse injizieren.
Ansonsten hättest Du nur eine globale toStr.edit:
Sorry, hab [edit] statt [quote] geklickt und Deine Frage kaputtgemacht.
-
std::string toStr(int var)
Das muss heißen:
std::string Scan::toStr(int var)
-
Hmm.. wie konnte mir das nur passieren. Danke

Mittlerweile funktioniert alles, bis auf die Zuweisung an den Vektor.
char* one = getLine(...); char* two = getLine(...); rtrn.push_back( list_of(one)(two) ); std::cout << rtrn[pos_rtrn][0] << std::endl;Gibt nichts aus (keine Fehlermeldung, einfach nichts), während ein cout mit one oder two sehr wohl etwas ausgibt. Die Boost-Libs sind eingebunden und an pos_return liegt es auch nicht, da z.B. [0][0] genauso wenig etwas ausgibt. Woran könnte das liegen? Ist die Zuweisung falsch? Sollte eigentlich stimmen.
Ausserdem bekomme ich eine Warnung für die Zuweisungen für one und two:
warning: deprecated conversion from string constant to ‘char*‘
Nur leider ist dem nicht so:char* Scan::getLine//... char* rtrn;//... return rtrn;
-
Man möge mir einen Push verzeihen, aber weiß niemand eine Lösung? Habe keine Ahnung was ich machen soll, und danach dürfte das ganze endgültig funktionieren, hoffe ich..
