代码之家  ›  专栏  ›  技术社区  ›  David

将数组的结构传递给函数

  •  -1
  • David  · 技术社区  · 6 年前

    我试图传递一个二维数组的结构,并对其进行计算。

    typedef struct{
        float X[80][2];
        float Y[80][2];
        float Z[80][2];
        int T[80][2];
        int K[80];
    } STATS;
    
    void MovingAverage(STATS *stat_array, int last_stat) {
        //Average = Average(Prev) + (ValueToAverage/n) - (Average(Prev)/n)
        stat_array->**X**[last_stat][0] =  stat_array->**X**[last_stat][0] +
            (stat_array->**X**[last_stat][1] / stat_array->T[last_stat][0]) -
            (stat_array->**X**[last_stat][0] / stat_array->T[last_stat][0]);
    }
    

    调用函数:

    MovingAverage(*stat_array, last_stat);
    

    我的问题是:

    如何以通用方式访问MovingAverage函数中的X、Y和Z?


    编辑:

    void MovingAverage(STATS *stat_array, int last_stat, (char *(array_idx)) { 
    //Average = Average(Prev) + (ValueToAverage/n) - (Average(Prev)/n)
        stat_array->**array_idx**[last_stat][0] = 
                    stat_array->**array_idx**[last_stat][0] + 
                    (stat_array->**array_idx**[last_stat][1] / 
                    stat_array->T[last_stat][0]) - 
                    (stat_array->**array_idx**[last_stat][0] / 
                    stat_array->T[last_stat][0]); 
    }
    

    我知道这行不通,但为了证明我的意愿,

    1 回复  |  直到 6 年前
        1
  •  1
  •   yano    6 年前

    这里有人(不是我)可能会想出一些预处理器魔术来满足您的要求,但这是我不会追求的解决方案。我认为这是一种糟糕的做法,因为宏很快就会变得毛茸茸的,很难调试。如果有意义的话,您的源代码中不能有“变量”。在构建过程中,首先运行的是预处理器,它解析所有宏。然后将源代码传递给编译器。编译器不会为你做任何文本替换,它会根据自己的源代码运行。要实现所需的功能,请编写一个对所需类型进行操作的函数,并使用所有类型调用该函数。我会改变你的 MovingAverage 功能如下:

    void MovingAverage(float arr[80][2], const int T[80][2], int last_stat)
    {
      arr[last_stat][0] = ... // whatever calculation you want to do here
    }
    
    int main(void)
    {
      STATS stat_array;
      int last_stat;
      // .. initialize stat_array and last_stat
    
      // now call MovingAverage with each of your 3 arrays
      MovingAverage(stat_array.X, stat_array.T, last_stat);
      MovingAverage(stat_array.Y, stat_array.T, last_stat);
      MovingAverage(stat_array.Z, stat_array.T, last_stat);
    
      ...
      return 0;
    }