более общее определение структур в C - PullRequest
0 голосов
/ 26 апреля 2020

Я практикую C, и кажется очень утомительным писать алгоритмы для по существу одних и тех же структур данных, но содержащих разные данные, тем более что отсутствие пространства имен означает, что я должен давать сверхдлинные заголовки всем

например:

//double matrix

typedef struct DubMatrix DubMatrix;

struct DubMatrix {
    int rows;
    int cols;
    double *data;
};

// int matrix

typedef struct IntMatrix IntMatrix;

struct IntMatrix {
    int rows;
    int cols;
    int *data;
};

У меня есть много функций, которые я хотел бы реализовать для работы с (среди прочего) матрицами различных типов чисел, такими как алгебраические числа c, элементы конечных полей и т. д. c.

Мне интересно, есть ли способ избежать повторного повторения по существу одних и тех же структур и функций снова и снова.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

Вы можете использовать теговые объединения , которые в основном представляют собой структуры, содержащие общие данные, и, что наиболее важно, поле tag , обозначающее тип, и объединение для самих данных.

Это может выглядеть как

struct Matrix
{
    size_t rows;
    size_t cols;
    enum
    {
        INT,
        DOUBLE
    } type;
    union
    {
        int *int_data;
        double *double_data;
    } data;
};

Тогда в зависимости от значения type вы используете либо data.int_data, либо data.double_data.


Другое возможное решение аналогично выше, но вместо объединения используйте указатель void * для данных и приведите их при необходимости.

0 голосов
/ 26 апреля 2020

C на самом деле не имеет понятия об универсальных или обобщенных c программировании, однако есть несколько приемов, которые вы можете использовать.

Вы можете использовать указатели void, но они должны быть выделены достаточно большими для самая большая вещь, которую вы будете хранить в них, иначе вы просто получите доступ к тому месту, которое вам не нужно.

Другая вещь, которую вы можете использовать для программирования generi c -i sh, - это объединения, которые могут иметь различные варианты. рассмотрим следующий пример, который является одним из стандартных oop примеров полиморфизма

struct triangle {...}
struct rectange {...}
union shape {struct triangle *;struct rectange *;}
enum type {triangle,rectangle}
struct shape {union shape *s,enum type type} /* this is like an interface*/

size_t area(struct shape *shape){...}

, это выглядит утомительно, но может быть легко сгенерировано с помощью макроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...