0

我创建了一个这样的通用矩阵结构:

typedef struct mat_t {
  /**
   * \brief matrix structure
   */
  unsigned int c, l;
  void **matrice;
}* mat;

我的问题是学习如何为矩阵分配内存,因为它可以包含复数、浮点数或其他...因此,我想知道如何将类型传递给我的函数参数以分配内存。

mat allocate_mat(unsigned int l, unsigned int c, **<type>** )

也许,我应该为此函数使用定义宏吗?

4

3 回答 3

1

问题 1:奇怪的变量名。什么是lc应该是什么意思?“线”,“计数”?C 中没有任何东西可以阻止您使用完整的单词作为变量名......

问题 2:您很可能使用带有指针对指针表示法的虚假的可能 2D 数组,这会导致堆碎片惨败。它不仅速度慢并导致堆碎片,而且不能与 memset()、memcpy() 等基本 C 函数一起使用。而是在相邻内存中分配一个真正的二维数组。

问题3:为什么* mat在struct typedef的末尾有?这没有任何意义。

这是使用通用 C 编程的动态矩阵的基本实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct mat_t
{
  void** data;
  size_t row_n;
  size_t col_n;
  size_t obj_size;
} matrix_t;


bool matrix_init (matrix_t* mat, 
                  size_t    row_n, 
                  size_t    col_n,
                  size_t    obj_size)
{
  mat->row_n = row_n;
  mat->col_n = col_n;
  mat->obj_size = obj_size;

  mat->data = calloc(row_n * col_n, obj_size);

  return mat->data != NULL;
}


void matrix_free (matrix_t* mat)
{
  free(mat);
}


void matrix_set (matrix_t* mat,
                 size_t    x,
                 size_t    y,
                 void*     val)
{
  size_t data_offset = y * mat->row_n * mat->obj_size + 
                       x * mat->obj_size;

  memcpy (mat->data + data_offset,
          val,
          mat->obj_size);
}


void* matrix_get (const matrix_t* mat,
                  size_t x,
                  size_t y)
{
  size_t data_offset = y * mat->row_n * mat->obj_size + 
                       x * mat->obj_size;

  return mat->data + data_offset;
}


int main()
{
  matrix_t mat;
  const int ROWS=3;
  const int COLS=2;

  // allocate memory
  matrix_init(&mat, ROWS, COLS, sizeof(int));


  // fill memory with data 1,2,3...
  int count =0;
  for(int row=0; row<ROWS; row++)
  {
    for(int col=0; col<COLS; col++)
    {
      count++;
      matrix_set (&mat, row, col, &count);
    }
  }

  // print the matrix
  for(int row=0; row<ROWS; row++)
  {
    printf("[ ");
    for(int col=0; col<COLS; col++)
    {
      printf("%d ", *(int*)matrix_get(&mat, row, col));
    }
    printf("]\n");
  }

  matrix_free(&mat);
  return 0;
}
于 2013-05-23T09:32:50.743 回答
1

也许,我应该为此函数使用定义宏吗?

是的,您可以定义一个宏以在最后一个参数中采用类型,并调用在最后一个参数中采用大小的实际函数。

#define allocate_mat(MAT_L, MAT_C, MAT_TYPE) allocate_mat_sz(MAT_L, MAT_C, sizeof(MAT_TYPE))
mat allocate_mat_sz (unsigned l, unsigned c, size_t size);
于 2013-05-23T08:22:16.067 回答
0

您可以传递矩阵元素的大小:

mat allocate_mat(unsigned int l, unsigned int c, unsigned int size_of_matrix_element )
于 2013-05-23T07:50:26.230 回答