Array 3D groß evtl malloc?
-
Ich such seit einigen Tagen eine Möglichkeit ein Tesor 3D in einer Funktion zu erstellen.
normale dekleration//[x=50,y=70, z=500]werden an Funktion übergeben. float t [x][y][z];
geht nicht da wohl mein STack zu klein ist.
Für 2 D floats hab ich auch schon den malloc code gefunden, der scheint auch zu funktionieren jedoch schaffe ich es nicht ihn auf 3D umzubauen.
Auch hab ich eine header nutil.c und until.h gefunden da steht eine float TEnsor Funktion drin. Jedoch sagt mein Win immer Malloch.exe muss beendet werden wenn ich das Programm ausführe. Irgenwas stimmt mit der Zuordnung zum speicher nicht, denn er stürtz erst ab wenn ich was in das Feld reinschreibn will.
Ich poste die TEnsor funktion des Headers:
float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh) /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */ { long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1; float ***t; /* allocate pointers to pointers to rows */ t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**))); if (!t) nrerror("allocation failure 1 in f3tensor()"); t += NR_END; t -= nrl; /* allocate pointers to rows and set pointers to them */ t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*))); if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()"); t[nrl] += NR_END; t[nrl] -= ncl; /* allocate rows and set pointers to them */ t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float))); if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()"); t[nrl][ncl] += NR_END; t[nrl][ncl] -= ndl; for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep; for(i=nrl+1;i<=nrh;i++) { t[i]=t[i-1]+ncol; t[i][ncl]=t[i-1][ncl]+ncol*ndep; for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep; } /* return pointer to array of pointers to rows */ return t; }
Compilieren macht er nur beim ausführen stürtz er ab und ich hab zum testen nur werte kleiner 10 genommen.
Zur Zeit verwende ich Dev-C++ auf XP zum schreiben und testen des Programms und eine mir unbekannte unix maschiene zum späteren neu compilieren und ausführen.
-
Hier ein kleines Beispielprogramm aus meinem Artikel, wie man 3D Arrays erstellt. Ist noch mit new und Templates, weil ursprünglich für C++ gedacht. Musst du halt ersetzen.
#include <iostream> using namespace std; template<typename T> //3D-Array ausgeben void print3D(T **mat, size_t x, size_t y, size_t z) { for (size_t i=0;i<x;++i) for (size_t j=0;j<y;++j) for (size_t k=0;k<z;++k) cout<< *(*(*(mat+i)+j)+k) <<'\n'; }; template <typename T> //3D-Array erstellen T ***create3D(size_t x, size_t y, size_t z) { //Im Prinzip haben wir hier nur ein Array(T***) mit T** Elementen wobei //jedes dieser T** ein weiteres Array von T* enthält. //Vllt. geht das auch einfacher??? T ***arr=0; arr = new T**[x]; for (size_t i=0;i<y;++i) *(arr+i) = new T*[y]; for (size_t i=0;i<x;i++) for (size_t j=0;j<y;++j) *(*(arr+i)+j) = new T[z]; return arr; }; template <typename T> //3D-Array wieder löschen void kill3D(T ***mat, size_t x, size_t y, size_t z) { for (size_t i=0;i<x;i++) for (size_t j=0;j<y;++j) delete [] *(*(mat+i)+j); for (size_t i=0;i<y;++i) delete [] *(mat+i); delete [] mat; mat = 0; }; int main(int argc, char **argv) { size_t x=10,y=10,z=10; int ***mat = create3D<int>(x,y,z); for (size_t i=0;i<x;++i) for (size_t j=0;j<y;++j) for (size_t k=0;k<z;++k) mat[i][j][k] = i+j+k; print3D(mat,x,y,z); kill3D(mat,x,y,z); return 0; };
-
@ oggyvan:
Deine Codeformatierung ist mir irgendwie zu kompakt, ein paar Leerzeichen/Leerzeilen würden sich ganz gut machen.
Auch die Variablennamen sind etwas "kompakt"
Und wenn ich mir deine Funktionsparameter (nrl, nrh, ncl, nch, ndl und ndh) anschaue, kommen mir ganz spontan Strukturen in den Sinn, dir auch?
</syntaxnazi>
PS: Nicht böse gemeint, nur als Anregung
-
GPC schrieb:
Hier ein kleines Beispielprogramm aus meinem Artikel, wie man 3D Arrays erstellt. Ist noch mit new und Templates, weil ursprünglich für C++ gedacht.
...sieht ja fies aus mit den ganzen 3-fach pointern. macht man das in c++ so?
-
net schrieb:
GPC schrieb:
Hier ein kleines Beispielprogramm aus meinem Artikel, wie man 3D Arrays erstellt. Ist noch mit new und Templates, weil ursprünglich für C++ gedacht.
...sieht ja fies aus mit den ganzen 3-fach pointern. macht man das in c++ so?
Frag mich nicht, ich hab noch nie 'n 3D Array gebraucht^^ In keiner Programmiersprache, die ich je benutzte. Ich hab das Beispiel damals nur für den Artikel geschrieben.
Man könnte natürlich auch den ganzen Käse am Stück anfordern und dann mit ner Zugriffsfunktion umrechnen oder so (der fanatische stl liebhaber schachtelt aber std::vector).
Oder wie wäre der von dir präferierte C-Weg?
-
GPC schrieb:
Oder wie wäre der von dir präferierte C-Weg?
ich brauche auch nie 3d-arrays, aber vielleicht so:
#define T char typedef T A3D[1][1][1]; A3D *Create3DArray (int size_x, int size_y, int size_z) { return (A3D*)malloc (size_x * size_y * size_z * sizeof(T)); }
-
//Das Ziel: //float t[50][70][500]; //der Weg float test = 0.0; typedef float(*ptr)[70][500];//erste Dimension lässt man weg // ptr ist der Zeiger, den man auch so schreiben kann: float(*)[70][500] ptr t = (ptr)malloc(50*70*500*sizeof(float)); t[3][8][444] = 4711.4711; t[0][0][0] = t[3][8][444]; test = t[3][8][444];
-
@TactX der code war aus ner Header aus dem Internet müsste also trozdem gehen.
@freak11 coole sache der Code funktioniert ist schön klein hab ihn gleich in mein Prog eingebautJA ich hab es nach 3 Tagen geschafft den TEnsor funktionsfähig einzubinden.
Mein Problem war nicht der TEnsor sonderen die vielen verschachtelten Schleifen. Naja jetzt läuft der Teil mal.
DANke noch mal für den Support.Nur noch ne Frage an freak11 den Speicher aus deinem code geb ich mit
free (t);
wieder Frei oder gibts da noch was zu beachten?
-
oggyvan schrieb:
Nur noch ne Frage an freak11 den Speicher aus deinem code geb ich mit
free (t);
wieder Frei oder gibts da noch was zu beachten?
free(t); und der Speicher ist wieder freigegeben - logo!