3 votes

Remplissage d'un tableau 3D de structures en C

Je dispose d'un réseau de structures en 3D. La grille 3D est telle que chacun des trois côtés est égal. Chaque cellule de la grille 3D a 5 éléments, disons couleur, température, B(x), B(y) et B(z). Je dois remplir chaque cellule du tableau de structures avec 5 fichiers binaires, un pour chaque élément.

Le tableau des structures ressemble à ceci :

struct physical
{
  float color;
  float temperature;
  float Bx,By,Bz;
};
extern struct physical ***physical;

J'ai besoin d'une idée de la manière dont je pourrais remplir les tableaux en C.

J'ai mis en place le code suivant pour lire les données des fichiers binaires dans le tableau de structures :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int i,j,k,ibox;         /* Loop indices for the physical grid */

FILE *p,*q,*r,*s,*t;

p = fopen("phys_col_0107.bin","rb");
q = fopen("phys_temp_0107.bin","rb");
r = fopen("phys_Bx_0107.bin","rb");
s = fopen("phys_By_0107.bin","rb");
t = fopen("phys_Bz_0107.bin","rb");

if (!p)      { printf("Unable to open color file!"); return 0; }
else if (!q) { printf("Unable to open the temp file!"); return 0; }
else if (!r) { printf("Unable to open the Bx file!"); return 0; }
else if (!s) { printf("Unable to open the By file!"); return 0; }
else if (!t) { printf("Unavle to open the Bz file!"); return 0; }

for ( j = 0 ; j < ny ; j++ )
{
  for (k=0;k<nz;k++)
  {
    for (i=0;i<nx;i++)
    {
      fread( &physical[i][j][k].color       , sizeof(physical[i][j][k].color)       , 1 , p ) ;
      fread( &physical[i][j][k].temperature , sizeof(physical[i][j][k].temperature) , 1 , q ) ;
      fread( &physical[i][j][k].Bx          , sizeof(physical[i][j][k].Bx)          , 1 , r ) ;
      fread( &physical[i][j][k].By          , sizeof(physical[i][j][k].By)          , 1 , s ) ;
      fread( &physical[i][j][k].Bz          , sizeof(physical[i][j][k].Bz)          , 1 , t ) ;
    }
  }
}

fclose(p);
fclose(q);
fclose(r);
fclose(s);
fclose(t);

J'ai juste besoin de savoir si je m'y prends de la bonne manière. ..... merci !!

0voto

Michael Dorgan Points 7849

Il y a quelques façons de le faire, d'après ce que je sais :

  1. Faites en sorte que vos données soient égales à la taille de votre tableau 3D. Remplissez les éléments inutilisés ou vides avec des 0 ou toute autre valeur sentinelle afin de savoir qu'il ne s'agit pas de "vrais". Cette méthode est moins efficace en termes d'espace, mais rend la lecture et la définition des données aussi simples qu'un simple appel à fread().
  2. Utilisez un schéma de type RLE où vous avez un octet où le bit du haut indique si le prochain passage est une donnée valide ou vide, suivi du nombre d'octets dans le passage (jusqu'à 127 ou 128 si les passages à 0 ne sont pas autorisés). Si les données sont valides, lisez ce nombre de structures et chargez-les directement dans votre grille. Si la course est invalide, sautez ce nombre de structures ou marquez-les d'une manière ou d'une autre comme invalides. L'avantage est qu'il est assez efficace en termes d'espace, mais plus lent à lire car il faudra plusieurs appels IO.
  3. Format de données XML dans lequel vous pouvez définir chaque élément comme un type dans le fichier XML. Facile à éditer le fichier de données, mais beaucoup plus lent à remplir votre structure et beaucoup plus gros sur le disque que les techniques binaires ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X