Задача 1: странные имена переменных. Что означает l
и c
? «Линии», «счет»? В C нет ничего, что препятствовало бы вам использовать полные слова в качестве имен переменных ...
Проблема 2: вы, скорее всего, используете ложный двумерный массив с указателем на указатель, что приводит к кучке фиаско фрагментации. Он не только замедляется и приводит к фрагментации кучи, но также не может использоваться с фундаментальными функциями C, такими как memset(), memcpy(). Выделите настоящий 2D-массив, а в соседней памяти.
Задача 3: Почему у вас есть * mat
в конце структуры 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;
}
Почему просто не проходящее размер типа? Например, 'mat allocate_mat (unsigned int l, unsigned int c, unsigned int size)' и затем вызывает его следующим образом: 'allocate_mat (10,5, sizeof (float))' – JBL