Referenz von Funktion von 3-dim Matrix
-
Hi
Ich komm bei folgendem Problem einfach nicht mehr weiter:
ich habe eine Funktion die aus einer Datei Zahlen ausliest und in einen 3-dim Array box[][][] speichert. Die Größe der Dimensionen hängen von der Anzahl der Zahlen in der Datei ab und können bei jedem Aufruf der Funktion verschieden sein. Die Funktion übergibt dann die Startadresse und die Dimensionen an die main Funktion, damit man dort die Matrix weiter verarbeiten kann. Ich hab das auch soweit hinbekommen, nur leider ändern sich die letzten Felder der Matrix nach der übergabe, zum Bsp sind bei einer int box[12][12][48] ab box[11][8][35] die Werte nach der übergabe Verändert. Davor stimmen sie. Was kann ich tun? Gibt es evtl. einen besseren Weg eine 3-dim Matrix von unbekannter Größe zu übergeben?Danke im vorraus
Jogi
-
Du kannst Arrays nur in der äußersten Dimension mit variabler Größe anlegen, alle übrigen Dimensionen müssen bereits beim Compilieren bekannt sein. Für das, was du vorhast, mußt du entweder Mehrfachzeiger verwenden und den Speicher ebenenweise anfordern, dein Dreidimensionales Array manuell auf einen eindimensionalen Bereich mappen (die Indexumrechnung x1,x2,x3 -> i = x1*d2*d3+x2*d3+x3 mußt du dann übernehmen) oder verschachtelte Vectoren verwenden.
PS: Siehe auch FAQ
-
Hi
Ich habe das ganze jetzt mit einem eindimensinalen array versucht, aber es funktioniert wieder nicht. Ich denke der Fehler liegt woanders. Ich stell einfach mal den Quelltext rein. Dass befindet sich halt noch in Entwicklung, wird also komisch aussehen...
#include <fstream> #include <iostream> #include <string> #include <sstream> using namespace std; int* read(int&, int&, int&, int&); //main //-------------------------------------------------- int main(int argc, char *argv[]) { int id = 1, xdim, ydim, zdim, g=0; int* mat = read(id, xdim, ydim, zdim); for (int x=0;x < xdim;x++){ for (int y=0;y < ydim;y++){ for (int z=0;z < zdim;z++){ cout << "<" << x << "," << y << "," << z << ">" << " = " << "ADR = " << (mat + g) << " = " << *( mat + g) << std::endl; ++g; } cout<<"\n"; } } }; //functions: //----------------------------------------------------------------------------------------- // read out //----------------------------------------------------------------------------------------- int* read(int &id, int &xdim, int &ydim, int &zdim){ int count=0, sc, xc, yc, zc; string line; float pt1[3], pt2[3], pt3[3], pt4[3], pt5[3], pt6[3], pt7[3], pt8[3], bc, sp, dx, dy, dz; char c; int g=0; string cl; //pointer to first adress int *p = NULL; // base-cell in m bc = 0.02; // space in m sp = 0.1; // space in cells sc = static_cast<int>(sp/bc+0.5); ifstream input_file("datei.txt"); while(!input_file.eof()){ getline(input_file, line); // count the fdtd objects if (line == "# fdtdt") { count++; if (count == id) { for (int i=0;i<=6;i++){ getline(input_file, line); } // First important line //----------------------------------------- istringstream istr (line); // Point 3 istr >>c>>pt3[1]>>pt3[2]>>pt3[3]>>c; // Point 1 istr >>c>>pt1[1]>>pt1[2]>>pt1[3]>>c; // Point 2 istr >>c>>pt2[1]>>pt2[2]>>pt2[3]>>c; // Point 4 istr >>c>>pt4[1]>>pt4[2]>>pt4[3]>>c; // skip this and next line getline(input_file, line); getline(input_file, line); // 2nd important line //----------------------------------------- istringstream istr2 (line); // Point 5 istr2 >>c>>pt5[1]>>pt5[2]>>pt5[3]>>c; // Point 7 istr2 >>c>>pt7[1]>>pt7[2]>>pt7[3]>>c; // Point 8 istr2 >>c>>pt8[1]>>pt8[2]>>pt8[3]>>c; // Point 6 istr2 >>c>>pt6[1]>>pt6[2]>>pt6[3]>>c; // edges in m dx = pt5[1] - pt1[1]; dy = pt3[2] - pt1[2]; dz = pt2[3] - pt1[3]; // edges in cells xc = static_cast<int>(dx/bc+0.5); yc = static_cast<int>(dy/bc+0.5); zc = static_cast<int>(dz/bc+0.5); // create box int box[(xc+2*sc)*(yc+2*sc)*(zc+2*sc)]; // write box; for (int x=0;x < (xc+2*sc);x++){ for (int y=0;y < (yc+2*sc);y++){ for (int z=0;z < (zc+2*sc);z++){ //if (x>sc && x<=xc+sc && y>sc && y<=yc+sc && z>sc && z<=zc+sc) box[g] = g; cout << "<" << x << "," << y << "," << z << ">" << " = " << "ADR = " << &box[g] << " = " << box[g] << std::endl; g++; // else // box[x][y][z] = 0; } } } xdim = xc+2*sc; ydim = yc+2*sc; zdim = zc+2*sc; cout << xdim << ydim << zdim << "\n"; cin >> cl; p = &box[0]; break; } } } input_file.close(); return p; };Was in der Funktion alle Werte richtig zugewiesen sind, und später dann die letzten nicht mehr. Wollte schon static for int box[] setzen, aber das gibt nur compilerfehler...
Thx
-
Erstmal kenne ich VLA's (Variable Length Arrays) nur aus C99, aber nicht aus C++. Und zweitens ist die Variable box, deren Adresse du zurückgeben willst, lokal in der Funktion read() - das heißt am Ende der Funktion wird dein Array wieder aufgeräumt und der zurückgegebene Zeiger verweist ins Nirvana. Wenn du schon dynamisch Speicher anfordern willst, dann verwende dazu wie jeder vernünftige Programmierer den Heap (new und delete).
PS: Falls du Angst hast vor Speicherlecks, kannst du auch einen STL-Container (z.B. vector<>) verwenden.
-
Ich lerne gerade C anhand eines Projektes, ich lerne Sachen einfach am liebsten indem ich es einfach probiere. Bin nicht so der Typ der sich mal en riesen Buch oder so reinpfeift. Jedenfalls werd ich mir jetzt doch mal in nem Tutorial diese Containerdinger anschauen. Bin zwar weder vernünftig noch ein Programmierer aber schaden kanns ja nicht.
Danke für die Hilfe.
Falls was nicht klappt weiß ich ja jetzt wo ich schnell gute Hilfe bekomme.
Greez