Return eines zweidimensionalen integer Arrays
-
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..
