wip on load
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 2 Oct 2025 17:26:59 +0000 (19:26 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 2 Oct 2025 17:26:59 +0000 (19:26 +0200)
load.c

diff --git a/load.c b/load.c
index 97447b16b704ad058ba74559be4837b93d145ae4..f2a2d0fe163fdfe752f78cceb76c354f3a5264eb 100644 (file)
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include <assert.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 /* constants */
 
 
 /* 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) {