将数组结构传递给函数
pass struct of arrays into function
我正在尝试传递二维数组的结构并对它们进行计算。
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]);
}
我知道不行,只是为了表明我的意愿,
这里有人(不是我)可能想出一些预处理器魔术来完成您的要求,但我不会追求这种解决方案。我认为这是不好的做法,因为宏很快就会变得毛茸茸并且难以调试。如果有意义的话,你的源代码中不能有 "variables" 。在构建过程中,首先运行的事情之一是预处理器,它解析所有宏。然后它将源代码传递给编译器。编译器不会为你做任何文本替换,它会根据它拥有的源代码进行处理。要实现您想要的,请编写一个对您想要的类型进行操作的函数,然后使用您的所有类型调用该函数。我会将您的 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;
}
我正在尝试传递二维数组的结构并对它们进行计算。
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]);
}
我知道不行,只是为了表明我的意愿,
这里有人(不是我)可能想出一些预处理器魔术来完成您的要求,但我不会追求这种解决方案。我认为这是不好的做法,因为宏很快就会变得毛茸茸并且难以调试。如果有意义的话,你的源代码中不能有 "variables" 。在构建过程中,首先运行的事情之一是预处理器,它解析所有宏。然后它将源代码传递给编译器。编译器不会为你做任何文本替换,它会根据它拥有的源代码进行处理。要实现您想要的,请编写一个对您想要的类型进行操作的函数,然后使用您的所有类型调用该函数。我会将您的 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;
}