Fehler bei return eines Objects (bzw. dessen Inhalt)
-
Hallo,
untenbei ist der Code, welcher mich seit einiger Zeit zum Verzweifeln bringt. Das Hauptproblem ist, dass die Funktion goToTarget zwei Variablen (ein Array und eine int für dessen Länge (da ich nicht in der Lage bin dessen Länge festzustellen)) zurückgeben müsste. Std::pair hatte nicht funktioniert (warum auch immer...), ebenso std:tuple. Deshalb implementierte ich ein Objekt "COM". Dieses sollte lediglich das Array und dessen int speichern. Wenn jedoch dieses COM-Objekt nach dem Array gefragt wird bekomme ich zufälligen Speicherinhalt (ich denke dies liegt daran, dass die mit dem Zeiger (direkt in COM kann ich das Array nicht richtig abspeichern) gespeicherten Variablen nach Funktionsende (von goToTarget) entfernt werden). Ich wäre über jede Hilfe um dieses Problem zu lösen äußerst dankbar, da ich keine Idee mehr habe dieses Problem zu umgehen. Ich schätze die Lösung ist zu einfach und ich übersehe diese die ganze Zeit... :p
Vielen Dank,
Simonmicro
P.S.: Wundert euch bitte nicht über die Art wie der nächste Wegpunkt (ConnectMatrix etc.) ermittelt wird. Dieser Ausschnitt stammt aus einem wesentlich größeren Molekül-Struktur-Berechnungs-Programm.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ /* * File: main.cpp * Author: simon * * Created on July 21, 2017, 2:48 PM */ #include <cstdlib> #include <iostream> #include <string> using namespace std; /* * */ int ConnectMatrix[11][11]; class COM { public: int* path; int pathlength; void printpath() { cout << "My best way(" << this->pathlength << "): "; for(int i = 0; i<this->pathlength; i++) { cout << this->path[i] << ", "; } cout << endl; } }; COM goToTarget(int pastway[], int pastwaylength, int iAm) { if (0 == pastwaylength) { cout << "Start of something big. I am " << iAm << "." << endl; } else { cout << "I'm node (" << iAm << ")." << endl; } int temp[pastwaylength+1]; for(int i = 0; i<pastwaylength; i++){ temp[i]=pastway[i]; } temp[pastwaylength] = iAm; pastwaylength++; pastway = temp; cout << iAm << ": " << "Pastway(" << pastwaylength << "): "; for(int i = 0; i<pastwaylength; i++) { cout << pastway[i] << ", "; } cout << endl; if(iAm == pastway[0] && pastwaylength > 1) { cout << iAm << ": " << "I AM THE TARGET!" << endl; COM t; t.path = pastway; t.pathlength = pastwaylength; return t; } COM tempminway; COM minfutureway; minfutureway.path = NULL; minfutureway.pathlength = 10^9999; bool iAmTheRightWay = false; for(int i = 0; i<11; i++) { if(ConnectMatrix[iAm-1][i] != 0) { cout << iAm << ": " << "Maybe select " << i+1 << "?" << endl; bool iIsValid = true; for(int i2 = 0; i2<pastwaylength; i2++) { if(i+1 == pastway[i2]) { iIsValid = false; cout << iAm << ": " << i+1 << " was already used!" << endl; } else { if(pastway[0] == i+1 && pastwaylength != 2) { iIsValid = true; } } } if(iIsValid) { cout << iAm << ": " << "Go way " << i+1 << endl; int* futureway; tempminway = goToTarget(pastway, pastwaylength, i+1); int futurewaylength = tempminway.pathlength; if(futurewaylength < minfutureway.pathlength && tempminway.pathlength != -1) { minfutureway.path = tempminway.path; minfutureway.pathlength = futurewaylength; iAmTheRightWay = true; cout << "New best way found (" << futurewaylength << " nodes):" << endl; minfutureway.printpath(); } } } } if(iAmTheRightWay) { minfutureway.printpath(); return minfutureway; } else { cout << iAm << ": " << "Then i am the wrong way." << endl; COM t; t.path = pastway; t.pathlength = -1; return t; } } int main(int argc, char** argv) { cout << "Hi." << endl; int MKette[11]; int Verbindungen[13][2]; MKette[0] = 1; MKette[1] = 2; MKette[2] = 3; MKette[3] = 4; MKette[4] = 5; MKette[5] = 6; MKette[6] = 7; MKette[7] = 8; MKette[8] = 9; MKette[9] = 10; MKette[10] = 11; Verbindungen[0][0] = 7; Verbindungen[1][0] = 3; Verbindungen[2][0] = 11; Verbindungen[3][0] = 6; Verbindungen[4][0] = 1; Verbindungen[5][0] = 2; Verbindungen[6][0] = 5; Verbindungen[7][0] = 3; Verbindungen[8][0] = 8; Verbindungen[9][0] = 6; Verbindungen[10][0] = 4; Verbindungen[11][0] = 2; Verbindungen[12][0] = 11; Verbindungen[0][1] = 5; Verbindungen[1][1] = 8; Verbindungen[2][1] = 2; Verbindungen[3][1] = 4; Verbindungen[4][1] = 7; Verbindungen[5][1] = 10; Verbindungen[6][1] = 9; Verbindungen[7][1] = 6; Verbindungen[8][1] = 10; Verbindungen[9][1] = 11; Verbindungen[10][1] = 10; Verbindungen[11][1] = 9; Verbindungen[12][1] = 1; for(int i = 0; i < 13; i++) { ConnectMatrix[Verbindungen[i][0]-1][Verbindungen[i][1]-1]=1; ConnectMatrix[Verbindungen[i][1]-1][Verbindungen[i][0]-1]=1; } for(int i = 0; i < 11; i++) { cout << i << ":"; for(int i2 = 0; i2 < 11; i2++) { cout << ConnectMatrix[i][i2] << " "; } cout << endl; } cout << "Number of Rings: " << 13-(11-1) << endl; //Number of connections - (Number of MKette - 1) COM aCircle = goToTarget({}, 0, 1); cout << "Best way(" << aCircle.pathlength << "): "; for(int i = 0; i<aCircle.pathlength; i++) { cout << aCircle.path[i] << ", "; } cout << endl; cout << "End." << endl; return 0; }
-
Ein Array ist kein Zeiger, ein Zeiger ist kein Array. Dein COM-Objekt enthält nur einen Zeiger auf die funktionslokalen Daten. Die werden am Ende der Funktion verworfen, egal ob da noch jemand drauf zeigt oder nicht.
-
[quote="SeppJ"]Ein Array ist kein Zeiger, ein Zeiger ist kein Array. Dein COM-Objekt enthält nur einen Zeiger auf die funktionslokalen Daten. Die werden am Ende der Funktion verworfen, egal ob da noch jemand drauf zeigt oder nicht.[/quote]
Hallo und danke SeppJ,Ich dachte, dass man einen Zeiger auf das Array setzen könnte - schließlich ist das Array auch nur ein Zeiger auf dessen ersten Eintrag. Ich werde mich nun in den nächsten Tagen dransetzen und versuchen eine nicht rekursive Lösung zu entwerfen. mal sehen ob die dann klappt.
MFG,
Simonmicro
P.S.: Gibt es eine Möglichkeit einen Pointer auf ein funktionslokales Array als return-Element zurückzuliefern ohne, dass das Array bei Ende der Funktion zerstört wird (Ich wollte mich eigentlich um eine global deklarierte Version drücken)?
-
Benutze std::vector.