Вопрос: Как мне спроектировать лучший интерфейс между массивами Cell и независимыми объектами Matrix?
Я конвертирую код MATLAB, который использует массивы ячеек и массивы ячеек, в C. Я создал тип данных Matrix.и тип данных Cell.Они проиллюстрированы ниже.
Тип данных Matrix
typedef struct{
double * array; // row major format
int rows;
int cols;
} Matrix;
и тип данных Cell
typedef struct{
Matrix * array; // row major format
int rows;
int cols;
} Cell;
К счастью, массив ячеек массивов ячеек в коде является простымодномерный массив ячеек, который я могу представить как массив ячеек.
В исходном коде независимые матричные объекты и элементы массива ячеек (другая матрица) появляются вместе в выражениях.Например:
a = rand(10);
% say, b is a cell array containing other matrices
% c = some expression involving an element of the cell array b and a
c = a + b{1,2};
% assuming dimensions agree
Теперь, в моем представлении, когда я создаю объект ячейки, я выделил строки * столбцы объектов Matrix и назначил указатель на массив объектов Matrix для массива (внутри ячейки),Предположим, что объекты Matrix соответствующим образом инициализируются позже в коде (перед их использованием)
Доступ к независимым объектам матрицы, которые я выделяю динамически, осуществляется путем разыменования указателей, указывающих на них, и процедуры доступа для массивов ячеек возвращают объекты Matrix.вместо указателя на объект Matrix.
// Function signature for accessor routine of cell object
Matrix get_mat_from_cell(Cell * cell, int row, int col);
// Independent Matrix object - dynamically allocated as size is known
// at run-time
Matrix * matrixA = (Matrix *) malloc(sizeof(Matrix));
Matrix matrixB = get_mat_from_cell(someCell, 1, 2);
add(matrixA, &matrixB, matrixC); // adds matrixA, matrixB and stores in a matrixC
То, что щекочет меня, заключается в функции добавления (например), чтобы получить единый интерфейс, который принимает указатели на матрицы для всех 3 аргументов, у меня естьпередать адрес матрицыB.Он либо выглядит одинаковым на уровне интерфейса функции - например, add (Matrix *, Matrix *, Matrix *), либо равномерным на уровне вызова функции - add (Matrix *, Matrix, Matrix *), но не в обоих направлениях.
Я мог бы достичь единообразия, объявив массив внутри объекта Cell как двойной указатель, но мне нужно дважды отменить ссылку, прежде чем я смогу добраться до объекта Matrix и подумать, не будет ли это узким местом в производительности, поскольку эти ячейкидействительно большие и часто доступны.
Как мне лучше спроектировать этот интерфейс?
Спасибо.