From ae4ea0afa0b741fde6ed353ad77887386b1a2871 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Thu, 2 Oct 2025 19:26:59 +0200 Subject: [PATCH] wip on load --- load.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/load.c b/load.c index 97447b1..f2a2d0f 100644 --- a/load.c +++ b/load.c @@ -4,6 +4,7 @@ #include #include +#include /* constants */ @@ -11,14 +12,17 @@ /* types */ -typedef double[MAXSIZE][MAXSIZE] matric_t; +typedef struct { + int n; + double *mat; +} matrix_t; /* static variables */ char *progname = NULL; char *version = "0.1"; -int nb_theads = 1; +int nb_threads = 1; /* usage function */ @@ -34,35 +38,78 @@ int usage (int ret) return ret; } +/* matix functions */ + +matrix_t * alloc_matrix (int n) +{ + matrix_t *m = (matrix_t *) calloc (1, sizeof (matrix_t)); + assert (m); + m->n = n; + m->mat = (double *) calloc (n * n, sizeof (double)); + assert (m->mat); + return m; +} + +void free_matrix (matrix_t *m) +{ + if (m) free (m->mat); + free (m); +} + +int set_matrix (matrix_t *m, int i, int j, double val) +{ + int rc = (m) && (i >= 0) && (i < m->n) && (i >= 0) && (i < m->n); + if (rc) { + m->mat[i + m->n * j] = val; + } + return !rc; +} + +int get_matrix (matrix_t *m, int i, int j, double *val) +{ + int rc = (val) && (m) && (i >= 0) && (i < m->n) && (i >= 0) && (i < m->n); + if (rc) { + *val = m->mat[i + m->n * j]; + } + return !rc; +} + + /* compute determinant */ -void get_comatrix (matrix_t comatrix, matrix_t matrix, int n, int k, int l) +void get_comatrix (matrix_t *comatrix, matrix_t *matrix, int k, int l) { - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { + for (int i = 0; i < matrix->n; i++) { + for (int j = 0; j < matrix->n; j++) { if ((i != k) & (j != l)) { - comatrix[i - (i > k)][j - (j > l)] = matrix[i][j]; + double val; + get_matrix (matrix, i, j, &val); + set_matrix (comatrix, i - (i > k), j - (j > l), val); } } } } -double determinant (matrix_t matrix, int n) +double determinant (matrix_t *matrix) { double det = 0; - if (n == 1) { - return matrix[0][0}; + if (matrix->n == 1) { + double val; + get_matrix (matrix, 0, 0, &val); + return val; } - matrix_t comatrix = { 0 }; + matrix_t *comatrix = alloc_matrix (matrix->n - 1); int sign = 1; - for (int l = 0; l < n; l++, sign = -sign) { - get_comatrix (comatrix, matrix, n, 0, l); - det += sign * matrix[0][l] * determinnat (comatrix, n - 1); + for (int l = 0; l < matrix->n; l++, sign = -sign) { + get_comatrix (comatrix, matrix, 0, l); + double val; + get_matrix (matrix, 0, l, &val); + det += sign * val * determinant (comatrix); } - return det + return det; } /* main function */ @@ -85,11 +132,8 @@ int main (int argc, char *argv[]) while (argc-- > 1) { char *arg = *(++argv); if (arg[0] != '-') { - if ((!parse_arg_ext) || (parse_arg_ext (arg))) { - fprintf (stderr, "%s: invalid option -- %s\n", progname, arg); - return usage (1); - } - continue; + fprintf (stderr, "%s: invalid option -- %s\n", progname, arg); + return usage (1); } char c = arg[1]; switch (c) { -- 2.30.2