【问题标题】:How to make easy access to struct as matrix如何轻松访问 struct 作为矩阵
【发布时间】:2021-09-13 16:06:59
【问题描述】:

我想创建一个struct,它可以有一个矩阵和一些参数;所以,例如,我有:

struct matrix {
    int rows;
    int cols;
    double** data;
} A;

我想使用A[x][y] = A.data[x][y] 之类的轻松访问,而不是A.data[x][y]。有什么想法吗?

【问题讨论】:

    标签: arrays c struct


    【解决方案1】:

    这是可行的,虽然有点棘手。

    您可以使用类似于Simple Dynamic Strings 中使用的技术。只需将元数据放在实际矩阵数据之前。

    像这样定义你的结构:

    struct matrix {
      int rows, cols;
      double *data[];
    };
    

    将其分配为具有灵活成员的典型结构。

    malloc(sizeof(struct matrix) + rows * sizeof(double*))
    

    现在转折。

    不是从matrix_create()返回struct matrix的指针,而是返回matrix.data指向成员的指针

    double **create_matrix(int rows, int cols) {
      struct matrix *m = malloc( ... );
      ... Allocation of rows
      return m->data;
    }
    

    这样你就可以使用漂亮的A[i][j] 表示法。

    接下来添加一个宏,以与container_of 类似的方式将此指向成员的指针转换回struct matrix。 示例实现。

    #define to_matrix(ptr) (struct matrix*)((char*)ptr - offsetof(struct matrix, data))
    

    现在你可以像这样实现matrix_get_rows()

    int matrix_get_rows(double **A) {
       struct matrix *m = to_matrix(A);
       return m->rows;
    }
    

    您可以以类似的方式实现类似的帮助器和析构器。

    典型的用法可能是:

    int main() {
      double **A = matrix_create(1,1);
      A[0][0] = 42;
      printf("%d %d\n", matrix_get_rows(A), matrix_get_cols(B));
      // should print "1 1"
      
      matrix_release(A);
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      我想制作的不是 A.data[x][y] ,而是 A[x][y] = A.data[x][y] 以便于访问。有什么想法吗?

      结构的成员只能通过成员选择运算符 (.) 通过该结构访问。它们只能通过间接成员选择运算符 (->) 通过指向结构的指针进行访问。 C 没有运算符重载,因此A[x][y] 形式不是替代方案。

      您可以创建一个函数或宏来隐藏data 成员的参与,但我个人认为这不会更好或更清晰。

      【讨论】:

        猜你喜欢
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        相关资源
        最近更新 更多