Array aus Funktion zurück
-
Hallo ich hab folgendes Problem
ich rufe eine Funktion auf die der ich ein char übergebe, die den char in ein Array umwandelt, und nun das Array zurück gibt.
Ich wollte also nur die Speicher adresse des Arrays zurück geben. Aber irgend etwas ging gehörig schief.int main(){ char zeile; rueckGaben = stringToArray(zeile); } string stringToArray(char* zeile){ //funktion die alle woerter eines strings splittet und in ein Array speichert int i = 0; string loadElemente[15]; //stringarray mit max 15 Elementen char* pToken = strtok(zeile, " "); if (pToken){ //fuer das erste Element loadElemente[i] = pToken; i++; while ( (pToken = strtok(NULL, " ")) ){ //für alle kommenden Elemente loadElemente[i] = pToken; i++; } } return *loadElemente; }was zurück kommt ist immer nur der erste Element vom vorhanden Array und nicht die Speicheradresse
-
Ishmael schrieb:
was zurück kommt ist immer nur der erste Element vom vorhanden Array und nicht die Speicheradresse
Also exakt das, was du mit
return *loadElemente;angefordert hast. Der Rückgabewert der Funktion ist außerdemstringund nicht 'Array aus Strings'. Ändere das und es sollte tun was du erwartest.
Was da in main steht, kann so nicht stimmen. Und deine Beschreibung des zu lösenden Problems passt auch nicht so recht zum Code.
-
-
Das kann ja schonaml gar nicht gehen, weil zeile ein char ist und weder char* noch char[].
-
Adressen bekommt man mit dem & Operator, der * Operator macht eher das Gegenteil. Deswegen bekommst du etwas anderes zurück als erwartet.
-
Du willst anscheinend einen Pointer oder Referenz auf ein Objekt zurückgeben, dass nur in deiner Funktion lebt. Das wird schiefgehen, weil es nach dem verlassen der Funktion nicht mehr existiert.
-
Du kennst ja offensichtlich std::string. Warum dann das ganze Rumgefrickel mit cstrings?
-
-
Im Grunde genommen hole ich mir eine Datei und will die zeilenweise splitten und diese Zeile in einer anderen Funtion jedes Element in ein Array speichern.
Damit ich das dann in der Ursprünglichen Funktion weiter verwenden kann.void getUptimeinfo(int kerne){ char zeile[MAX]; ifstream loadavg("/proc/loadavg", ios::in | ios::binary); if (loadavg.good()){ loadavg.seekg(0L, ios::beg); while (!loadavg.eof()){ string loadElemente[15]; string rueckGaben; if(loadavg.getline(zeile, MAX)){ rueckGaben = stringToArray(zeile); cout <<"Rueckgabewerte:\t\t " << rueckGaben << endl; } } } } string stringToArray(char* zeile){ int i = 0; string loadElemente[15]; char* pToken = strtok(zeile, " "); if (pToken){ loadElemente[i] = pToken; i++; while ( (pToken = strtok(NULL, " ")) ){ loadElemente[i] = pToken; i++; } } return *loadElemente; }
-
Hast Du die Antwortbeiträge überhaupt gelesen?
-
Ja hab ich.
-
Sorry wenn ich mich an einigen Stellen bissl blöd anstelle, ich bin Perl gewohnt und tu mich an einigen Sachen in C++ schwer.
-
Ishmael schrieb:
Ja hab ich.
Dann solltest du auch auf sie eingehen anstatt unbehelligt weiterzuerzählen.
Ich würde mich ebenfalls ein wenig von dem
char-Array lösen. Da musst du dich nicht auf eine konstante Grösse festlegen, die in den meisten Fällen Speicher verschwendet aber hin und wieder das Programm zum Absturz bringt, weil der Puffer eben doch zu klein war.Eine Möglichkeit, mehrere Wörter zurückzugeben, sieht folgendermassen aus. Für die Implementierung kannst du dir die Funktionen
std::string::find()undstd::string::substr()auf www.cplusplus.com anschauen. Du kannst natürlich auch bei deinemstrtok()bleiben, aber halte das möglichst lokal.std::vector<std::string> split_words(const std::string& line);Um eine Zeile einzulesen, bei der die Länge egal ist, gibt es die globale Funktion
std::getline():std::ifstream stream("file.txt"); std::string line; std::getline(stream, line);Ishmael schrieb:
Sorry wenn ich mich an einigen Stellen bissl blöd anstelle, ich bin Perl gewohnt und tu mich an einigen Sachen in C++ schwer.
Ich rate dir, ein gutes Buch wie den C++-Primer zu lesen. C++ ist eine schwierige Programmiersprache - um die Dinge grundlegend zu verstehen, kommst du nicht um ausführliche Theorie herum.
-
He danke für deine Hilfe.
Ich glaube ich muss mich mal richtig intensiv damit beschäftigen.