Добрый день.
Есть такая структура:
struct tmatrix_entry {
double price;
double amt;
};
struct tmatrix {
struct tmatrix_entry **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;
Вопрос: как избежать дублирования повторяющегося кода? Единственное, что я придумал, это делать одну статическую функцию, которая имеет параметр, по которому мы определяем, какое из полей обрабатывать. Потом к ней делаем функции-обёртки и прототипы этих обёрток выносим в хэдер. Типа такого:
enum field {
PRICE, AMT
};
static void set_entries_values (struct tmatrix *tm, enum field field, double *values[]) {
for (int i = 0; i < tm->rows; ++i)
for (int j = 0; j < tm->cols; ++j) {
if (field == PRICE)
tm->entries[i][j].price = (values) ? values[i][j] : 0;
else if (field == AMT)
tm->entries[i][j].amt = (values) ? values[i][j] : 0;
}
}
void tmatrix_set_prices (struct tmatrix *tm, double *prices[]) {
set_entries_values(tm, PRICE, prices);
}
void tmatrix_set_amts (struct tmatrix *tm, double *amts[]) {
set_entries_values(tm, AMT, amts);
}