я довольно новичок в 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);
}
да, прохождение индикатора вероятно





#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;
Это честно звучит как проблема, которая не нуждается в исправлении.
Но вы могли бы сделать что-то вроде этого:
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);
}
Вы можете добавить решающий фактор по своим параметрам
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);
}
Ну, я надеюсь, это то, что ты хотел
это может быть, но это зависит от того, как вы можете гибко изменить эту функцию. например, может ли универсальная функция получить третий аргумент в качестве индикатора?