我创建了一个像这样的通用矩阵结构:
typedef struct mat_t {
/**
* \brief matrix structure
*/
unsigned int c, l;
void **matrice;
}* mat;
我的问题是学习如何为矩阵分配内存,因为它可以包含复数,浮点数或其他... 因此,我想知道如何将类型传递给我的函数参数以获得分配内存。
mat allocate_mat(unsigned int l, unsigned int c, **<type>** )
也许,我应该为这个函数使用一个定义宏吗?
答案 0 :(得分: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);
答案 1 :(得分:1)
问题1:奇怪的变量名称。 l
和c
应该是什么意思? “行”,“数”? C中没有任何内容阻止您将完整单词用作变量名...
问题2:你最有可能使用一个假的二维数组,指针到指针表示法,这会导致堆碎片惨败。它不仅速度慢而且导致堆碎片,它也不能用于基本的C函数,如memset(),memcpy()。相反,在相邻的内存中分配一个真正的2D数组。
问题3:为什么在struct typedef的末尾有* mat
?这没有任何意义。
以下是使用通用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;
}
答案 2 :(得分:0)
您可以传递矩阵元素的大小:
mat allocate_mat(unsigned int l, unsigned int c, unsigned int size_of_matrix_element )