Datenimport eines 2D Array in 3D Array (Pointer)

mag1000

Grünschnabel
Guten Morgen zusammen,
ich hoffe jemand kann mir helfen.
Die Programmiersprache ist C:
Binäre Daten sollen mittels fread eingelesen werden. Dabei handelt es sich hier speziell um Daten, die einen 2D-Array darstellen. Weil dies aber ein sonderfall ist, hat der empfangende Array nicht 2 sondern 3 Dimensionen vorgesehen. Meine Idee war es, die dritte DImension einfach auf 1 zu setzen.

Wichtig anzumerken ist auch, dass es sich um einen Pointer handelt, dem ich mittels malloc Speicher reserviert habe.

C:
pnt_U_snapshot->rho = (float ***)malloc(pnt_configuration->int_iMax* sizeof(float **));
	for(i = 0; i < pnt_configuration->int_iMax; i++)
	{
		pnt_U_snapshot->rho[i] = (float **)malloc(pnt_configuration->int_jMax* sizeof(float *));
	}
	for(i = 0; i < pnt_configuration->int_iMax; i++)
	{
		for(j = 0; j < pnt_configuration->int_jMax; j++)
		{
			pnt_U_snapshot->rho[i][j] = (float *)malloc(pnt_configuration->int_kMax* sizeof(float));
		}
	}
Als Info noch:
pnt_U_snapshot ist der Zeiger auf folgende structure
C:
struct strct_U_snapshot
{
	float ***rho;
	float ***u;
	float ***v;
	float ***w;
	float ***p;
	float ***e;
};
pnt_configuration->int_kMax hat also den Wert 1 in diesem speziellen Fall.

Das Problem entsteht jetzt beim Import:
C:
	FILE  *fd0;
	fd0=fopen("result","rb");
        fread(pnt_U_snapshot->rho, 256*32*sizeof(float), 1, fd0);
        fclose(fd0);
        printf("TESTOUTPUT\n");
        printf("pnt_U_snapshot: %f\n",pnt_U_snapshot->rho[0][0][0]);
Bis zu "TESTOUTPUT" komme ich noch, aber dann crashed das Programm "Speicherzugriffsfehler"

Wie man am fread Befehl erkennt, ist der 2D-Array 256*32 Elemente groß und daher sind: pnt_configuration->int_iMax=256
pnt_configuration->int_jMax=32
Alloziert wurde also genug Speicher.
 
Zuletzt bearbeitet:
Hi.

Das kann so nicht funktionieren.

Du hast ein Array von Zeigern. Das Array selbst hat eine Größe von pnt_configuration->int_iMax* sizeof(float**) wie du selbst festgelegt hast. Die anderen Dimensionen spielen in diesem Fall überhaupt keine Rolle.

Du versuchst dann in dieses Array Daten der Größe 256*32*sizeof(float) zu speichern, was einfach viel zuviel ist.

Grundsätzlich benötigst du um einen Block von n Bytes zu speichern, einen Block von n Bytes Speicher. ;-]

Du mußt die einzelnen Daten selbst aufteilen und eine Schleife verwenden:
C++:
for (int i = 0; i < ...; ++i) {
  for (int j = 0; j < ...; ++j) {
    fread(pnt_U_snapshot->rho[i][j], ... *sizeof(float), 1, fd0);
  }
}
Gruß
 
Hi,
danke für deine Antwort.
Also der Code wurde jetzt so modifiziert:
C:
for(i=0;i<imax;i++){for(j=0;j<jmax;j++){for(k=0;j<kmax;k++){fread(&pnt_U_snapshot->rho[i][j][k],sizeof(float),1,fd0);}}}

Jetzt kommt zwar keine Fehlermeldung mehr, aber das Programm scheint irgendwo hängenzubleiben. Endlosscheife oder so.
Hab schon die Werte von imax,jmax und kmax kontrolliert.
imax=256
jmax=32
kmax=1
Daran liegts nicht.
Eine Idee?

Gruß
 
Ätzend wenn man immer solche Kleinigkeiten übersieht.
Vielen Dank. Läuft jetzt genauso, wie es soll!
Schönes Wochenende!
 
Zurück