Основываясь на том, что ваши массивы (columns
и types
) индексируются одним и тем же индексом [столбец], я делаю вывод, что данная строка должна быть одного типа?
У вас есть [по существу] динамический c 2D «разреженный» массив.
Вместо использования двойных звездочек (например, void **
) я бы создал несколько структур для расширения.
Это может быть немного переоформления, но вот мой взгляд на это:
#include <stdlib.h>
#include <stdio.h>
typedef enum {
TYPE_INT,
TYPE_DOUBLE,
TYPE_CONST_INT,
TYPE_CONST_DOUBLE,
} type_t;
typedef union {
void *vp;
const void *vpc;
int *ip;
const int *ipc;
double *dp;
const double *dpc;
} rowptr_t;
typedef struct {
int type;
rowptr_t *rowptr;
} column_t;
typedef struct {
int mat_ncol;
int mat_nrow;
column_t *mat_base;
} matrix_t;
size_t
typesize(type_t type)
{
size_t siz;
siz = 0;
switch (type) {
case TYPE_INT:
case TYPE_CONST_INT:
siz = 4;
break;
case TYPE_DOUBLE:
case TYPE_CONST_DOUBLE:
siz = 8;
break;
}
return siz;
}
const char *
typefmt(type_t type)
{
const char *fmt;
fmt = NULL;
switch (type) {
case TYPE_INT:
case TYPE_CONST_INT:
fmt = "%d";
break;
case TYPE_DOUBLE:
case TYPE_CONST_DOUBLE:
fmt = "%Lf";
break;
}
return fmt;
}
void
typeprt(matrix_t *mat,int colidx,int rowidx)
{
column_t *col;
rowptr_t *row;
const void *vpc;
col = &mat->mat_base[colidx];
row = &col->rowptr[rowidx];
vpc = row->vpc;
switch (col->type) {
case TYPE_INT:
case TYPE_CONST_INT:
printf("%d",*(const int *) vpc);
break;
case TYPE_DOUBLE:
case TYPE_CONST_DOUBLE:
printf("%.3f",*(const double *) vpc);
break;
}
}
void
matinit(matrix_t *mat,int ncol,int nrow)
{
mat->mat_nrow = nrow;
mat->mat_ncol = ncol;
mat->mat_base = calloc(ncol,sizeof(*mat->mat_base));
}
void
allocrow(matrix_t *mat,int colidx,type_t type)
{
column_t *col;
size_t siz;
siz = typesize(type);
col = &mat->mat_base[colidx];
col->rowptr = malloc(mat->mat_nrow * siz);
col->type = type;
}
int
main(void)
{
matrix_t mat;
matinit(&mat,2,3);
allocrow(&mat,0,TYPE_INT);
allocrow(&mat,1,TYPE_DOUBLE);
for (int i = 0; i < mat.mat_ncol; ++i) {
for (int j = 0; j < mat.mat_nrow; ++j) {
printf("value of column %d and row %d is: ", i + 1, j + 1);
typeprt(&mat,i,j);
printf("\n");
}
}
return 0;
}