Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中填充三维结构数组_C - Fatal编程技术网

在C语言中填充三维结构数组

在C语言中填充三维结构数组,c,C,我有一个3D结构阵列。三维网格使三条边中的每一条相等。三维网格的每个单元有5个元素,即颜色、温度、B(x)、B(y)和B(z)。我必须用5个二进制文件填充结构数组的每个单元格,每个元素一个 结构数组如下所示: struct physical { float color; float temperature; float Bx,By,Bz; }; extern struct physical ***physical; 我需要的是一些关于如何在C中填充数组的想法 我实现了以下代码,用于

我有一个3D结构阵列。三维网格使三条边中的每一条相等。三维网格的每个单元有5个元素,即颜色、温度、B(x)、B(y)和B(z)。我必须用5个二进制文件填充结构数组的每个单元格,每个元素一个

结构数组如下所示:

struct physical
{
  float color;
  float temperature;
  float Bx,By,Bz;
};
extern struct physical ***physical;
我需要的是一些关于如何在C中填充数组的想法

我实现了以下代码,用于将二进制文件中的数据读取到结构数组中:

#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);
#包括
#包括
#包括
#包括
inti,j,k,ibox;/*物理网格的循环索引*/
文件*p,*q,*r,*s,*t;
p=fopen(“phys_col_0107.bin”,“rb”);
q=fopen(“物理温度0107.bin”、“rb”);
r=fopen(“phys_Bx_0107.bin”,“rb”);
s=fopen(“phys_By_0107.bin”,“rb”);
t=fopen(“phys_Bz_0107.bin”,“rb”);
如果(!p){printf(“无法打开颜色文件!”),则返回0;}
如果(!q){printf(“无法打开临时文件!”),则返回0;}
如果(!r){printf(“无法打开Bx文件!”),则返回0;}
如果(!s){printf(“无法打开By文件!”),则返回0;}
如果(!t){printf(“无法打开Bz文件!”),则返回0;}
对于(j=0;j对于(k=0;k,有几种方法可以从我的头顶上实现这一点:

  • 让数据与3D数组的大小相等。将未使用的或空的元素填充0或其他sentinel值,以便知道它是“不真实的”。这样节省空间,但使读取和设置数据变得像单个fread()调用一样简单
  • 使用RLE类型的方案,其中您有一个1字节,其中顶部的位表示下一次运行是否为有效数据或空,后跟运行中的字节数(如果不允许0次运行,则最多为127或128)。如果数据有效,请在中读取那么多结构并直接将其加载到网格中。如果运行无效,请跳过那么多结构或将其标记为无效。优点是它非常节省空间,但读取速度较慢,因为它将需要多个IO调用
  • XML数据格式,您可以在其中将每个元素设置为XML文件中的一种类型。编辑数据文件很容易,但填充结构的速度要慢得多,磁盘上的大小要比二进制技术大得多

  • memset(…)
    没有选择?我刚听你说过memset Cole……例如??请看。你是说你有一个颜色数据文件,另一个温度数据文件,第三个Bx数据文件,还有两个By和Bz数据文件?还是每个“物理”实例都有一个文件?是的,Graham,每个都有一个数据文件。正如我在下面对Michael说的,如果数据是二进制格式的。这样,它就可以简单地放入数组中。我想Michael,否则无意义的东西会填充数组中未分配的位置。对于你的其他建议,我完全是新手,但愿意研究它们。顺便说一句,memset()仅在用单个集合值填充整个数组时才有用。我不相信这是您试图做的。不,memset看起来像是一个蛮力选项。我倾向于fread()但是,当输入文件是二进制类型时,这似乎效果最好。二进制类型将是最简单的选择。在将文本放入数组之前,任何其他操作都需要代码将文本转换为二进制。