Обобщение функций в 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);
}

это может быть, но это зависит от того, как вы можете гибко изменить эту функцию. например, может ли универсальная функция получить третий аргумент в качестве индикатора?

Ben Eslami 22.12.2020 23:57

да, прохождение индикатора вероятно

hammi 22.12.2020 23:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
#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);
}

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

Другие вопросы по теме