Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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_Struct - Fatal编程技术网

C 破坏结构

C 破坏结构,c,struct,C,Struct,在我的程序中,我使用了如下结构: typedef struct R{ float s1; float s2; float s3; }Rtype; 然后: typedef struct Z{ Rtype rval[8][8]; }Ztype; 我接下来要做的是恢复3个二维浮点数表并分别使用它们。为此,我使用: Ztype* b; float f[8][8]; for(int i = 0; i < 8; i++) for(int j = 0; j &l

在我的程序中,我使用了如下结构:

typedef struct R{
    float s1;
    float s2;
    float s3;
}Rtype;
然后:

typedef struct Z{
    Rtype rval[8][8];
}Ztype;
我接下来要做的是恢复3个二维浮点数表并分别使用它们。为此,我使用:

Ztype* b;
float f[8][8];
for(int i = 0; i < 8; i++)
   for(int j = 0; j < 8; j++)
      if(mask == 0)
        f[i][j] = b->rval[i][j].s1;
      else if(mask ==1)
        f[i][j] = b->rval[i][j].s2;
      else
        f[i][j] = b->rval[i][j].s3;
Ztype*b;
浮动f[8][8];
对于(int i=0;i<8;i++)
对于(int j=0;j<8;j++)
如果(掩码==0)
f[i][j]=b->rval[i][j].s1;
else if(掩码==1)
f[i][j]=b->rval[i][j].s2;
其他的
f[i][j]=b->rval[i][j].s3;

但我认为应该有办法做得更好。所以我的问题是:我该怎么做呢?

有几种方法,以下是我想到的第一种方法:

  • 检查
    mask
    一次,并选择一个做正确事情的不同循环,假设
    mask
    在循环中从未改变
  • 检查
    mask
    一次,计算每个
    rval
    底部的指针偏移量,并使用该偏移量复制浮点。赋值将类似于
    f[i][j]=*(float*)((char*)b.rval[i][j]+offset)看起来很吓人,但应该编译成像样的东西
  • 使用
    union
    s1
    s2
    s3
    字段覆盖数组,这样就可以执行
    f[i][j]=b.rval[i][j].u.array[mask]或类似的东西
  • 检查
    mask
    一次,并设置一个指向正确赋值函数的函数指针。但是,如果函数调用很昂贵,这可能会很昂贵

  • 我可能会选择第一个或第二个。使用宏替换或指向一维数组的指针,如下所示:

    Rtype (* pRval)[8] = b->rval;
    
    // ...
    
    f[i][j] = pRval[i][j].si;
    

    看起来好多了:)。

    @Kevin:1。我吃了*。2.这只是我正在做的一个例子。我希望在你的实际代码中,
    b
    被初始化。@Medinoc:当然是;)三个表的尺寸是否相关?这可能会影响您的设计选择…@awashburn:对于所有三张桌子,它始终是8x8。