#c #optimization #code-formatting #generalization
#c #оптимизация #форматирование кода #обобщение
Вопрос:
я довольно новичок в C.
я написал следующий код. и все следующие функции почти идентичны. я просто хочу знать, есть ли способ свести следующие функции к общим
struct tensor add(struct tensor t1, struct tensor t2){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
struct tensor sub(struct tensor t1, struct tensor t2){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] - t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
struct tensor mul(struct tensor t1, struct tensor t2){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] * t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
есть и другие функции. по одному для каждого оператора со следующим форматом
struct tensor genericfunc(struct tensor t1, struct tensor t2){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] ?? t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
Комментарии:
1. это может быть, но это зависит от того, как вы можете гибко изменять эту функцию. например, возможно ли, чтобы универсальная функция получала третий аргумент в качестве индикатора?
2. да, передача индикатора как вероятного
Ответ №1:
#define definefunc(name, op)
Tensor name(Tensor t1, Tensor t2) {
int data[t1.size];
for (int i = 0; i < t1.size; i)
data[i] = t1.data[i] op t2.data[i];
return Tensor(t1.rank, t1.shape, data);
}
definefunc(add, )
definefunc(sub, -)
definefunc(mul, *)
или
typedef int (*TensorOp)(int, int)
Tensor genericfunc(Tensor t1, Tensor t2, TensorOp op) {
int data[t1.size];
for (int i = 0; i < t1.size; i)
data[i] = op(t1.data[i], t2.data[i]);
return Tensor(t1.rank, t1.shape, data);
}
int TensorOp_add(int a, int b) { return a b; }
int TensorOp_sub(int a, int b) { return a - b; }
int TensorOp_mul(int a, int b) { return a * b; }
Tensor add(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_add); }
Tensor sub(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_sub); }
Tensor mul(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_mul); }
Приведенные выше фрагменты предполагают следующее, чтобы избежать использования struct
везде:
typedef struct tensor Tensor;
Ответ №2:
Честно говоря, это звучит как проблема, которая не нуждается в исправлении.
Но вы могли бы сделать что-то вроде этого:
struct tensor genericfunc(struct tensor t1, char op, struct tensor t2) {
int data[t1.size];
int i = 0;
switch(op) {
case ' ': while (i < t1.size) { data[i] = t1.data[i] t2.data[i]; i ; } break;
// Implement the rest of the ops here
}
return Tensor(t1.rank, t1.shape, data);
}
Ответ №3:
вы можете добавить решающий параметр для своих параметров
struct tensor add(struct tensor t1, struct tensor t2,int decider){
if(decider==1){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
if(decider ==2){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] - t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
if (decider ==3){
int data[t1.size];
int i = 0;
while (i < t1.size) { data[i] = t1.data[i] * t2.data[i]; i ; }
return Tensor(t1.rank, t1.shape, data);
}
ну, я надеюсь, что это то, что вы хотели