обобщение функций в C

#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);
}
 

ну, я надеюсь, что это то, что вы хотели