我有以下结构体:
struct tmatrix {
struct tmatrix_entry {
double price;
double amt;
} **entries;
double *stocks;
double *needs;
int rows;
int cols;
};
并且有以下功能:
void tmatrix_set_prices (struct tmatrix *tm, double *prices[]) {
for (int i = 0; i < tm->rows; ++i)
for (int j = 0; j < tm->cols; ++j)
tm->entries[i][j].price = (prices) ? prices[i][j] : 0;
}
void tmatrix_set_amts (struct tmatrix *tm, double *amts[]) {
for (int i = 0; i < tm->rows; ++i)
for (int j = 0; j < tm->cols; ++j)
tm->entries[i][j].amt = (amts) ? amts[i][j] : 0;
}
我猜创建两个几乎相同的函数并不是很酷,所以到目前为止我得出以下结论:
#define TMATRIX_SET_2D_ARRAY(TM, FIELD, ARRAY)\
do {\
for (int i = 0; i < TM->rows; ++i)\
for (int j = 0; j < TM->cols; ++j)\
TM->entries[i][j].FIELD = (ARRAY) ? ARRAY[i][j] : 0;\
} while (0)
然后:
void tmatrix_set_prices (struct tmatrix *tm, double *prices[]) {
TMATRIX_SET_2D_ARRAY(tm, price, prices);
}
void tmatrix_set_amts (struct tmatrix *tm, double *amts[]) {
TMATRIX_SET_2D_ARRAY(tm, amt, amts);
}
这是一个不好的解决方案吗?有人告诉我是这样的。他们还告诉我可以使用 offsetof()
来完成,但它看起来更复杂、更难使用。或者将 entries
设为数组而不是结构体会更好吗?实现这种函数的最佳方法是什么?