summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper2025-09-09 12:16:26 +0200
committerJasper2025-09-09 12:16:26 +0200
commit5fd2f59d9f30253cb0c64a06a4a305e90b89e3ae (patch)
tree1fa55449eb91489a428eeb48307d7d314b208860
parent29f92b1c7dad80b40654f561fbe82f5c1d9df7b2 (diff)
Variadic functions to free matrices/vectors
Renamed 'matrix_freen' to 'matrix_free_many1'. Frees a dynamic array of matrices.
-rw-r--r--debug.c3
-rw-r--r--matrix.c15
-rw-r--r--matrix.h3
-rw-r--r--tests.c11
-rw-r--r--vector.c13
-rw-r--r--vector.h1
6 files changed, 38 insertions, 8 deletions
diff --git a/debug.c b/debug.c
index 0dbc2b9..22a718b 100644
--- a/debug.c
+++ b/debug.c
@@ -49,8 +49,7 @@
TIMER(&_samples[i], \
func(_A, _B, ##__VA_ARGS__) \
); \
- matrix_free(_A); \
- matrix_free(_B); \
+ matrix_free_many(2, _A, _B); \
} \
print_bm(#func, (details_str), _samples, MATRIX_BM_N_SAMPLES); \
} while(0)
diff --git a/matrix.c b/matrix.c
index 0a8925e..5038b91 100644
--- a/matrix.c
+++ b/matrix.c
@@ -9,6 +9,7 @@
#include <string.h>
#include <math.h>
#include <time.h>
+#include <stdarg.h>
Matrix *matrix_alloc(size_t m, size_t n)
{
@@ -28,7 +29,19 @@ void matrix_free(Matrix *mat)
free(mat);
}
-void matrix_freen(Matrix **mats)
+void matrix_free_many(size_t argcount, ...)
+{
+ va_list argptr;
+
+ va_start(argptr, argcount);
+
+ for (size_t i = 0; i < argcount; ++i)
+ matrix_free(va_arg(argptr, Matrix *));
+
+ va_end(argptr);
+}
+
+void matrix_free_many1(Matrix **mats)
{
Matrix *mat, **p;
p = mats;
diff --git a/matrix.h b/matrix.h
index c4c11eb..5c58d72 100644
--- a/matrix.h
+++ b/matrix.h
@@ -44,7 +44,8 @@ typedef struct Matrix {
Matrix *matrix_alloc(size_t m, size_t n);
void matrix_free(Matrix *mat);
-void matrix_freen(Matrix **mats);
+void matrix_free_many(size_t argcount, ...);
+void matrix_free_many1(Matrix **mats);
void matrix_print(const Matrix *mat);
diff --git a/tests.c b/tests.c
index 2a89316..9ff1850 100644
--- a/tests.c
+++ b/tests.c
@@ -4,6 +4,7 @@
#include "vector.h"
#include <assert.h>
+#include <stdlib.h>
void test_LR()
{
@@ -11,15 +12,17 @@ void test_LR()
Vector *b = vector_from_str("[-1;2;3]");
Matrix **LR = matrix_LR(A, b);
- Matrix *L = LR[0];
- Matrix *R = LR[1];
- Vector *y = matrix_forwardel(L, b);
- Vector *x = matrix_backsubst(R, y);
+ Vector *y = matrix_forwardel(LR[0], b);
+ Vector *x = matrix_backsubst(LR[1], y);
vector_print(x);
/* TODO: Implement matrix vector multiplication */
/* assert(matrix_eq(matrix_mult(A, x), b, 0.01)); */
+
+ matrix_free(A);
+ matrix_free_many1(LR);
+ vector_free_many(3, x, y, b);
}
void run_tests()
diff --git a/vector.c b/vector.c
index 48b1901..dda9621 100644
--- a/vector.c
+++ b/vector.c
@@ -8,6 +8,7 @@
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
+#include <stdarg.h>
Vector *vector_alloc(size_t m)
{
@@ -37,6 +38,18 @@ void vector_free(Vector *v)
free(v);
}
+void vector_free_many(size_t argcount, ...)
+{
+ va_list argptr;
+
+ va_start(argptr, argcount);
+
+ for (size_t i = 0; i < argcount; ++i)
+ vector_free(va_arg(argptr, Vector *));
+
+ va_end(argptr);
+}
+
void vector_print(const Vector *v)
{
if (v->is_colvec) matrix_print(v->mat);
diff --git a/vector.h b/vector.h
index 3df897e..0d00d4f 100644
--- a/vector.h
+++ b/vector.h
@@ -26,6 +26,7 @@ Vector *vector_alloc(size_t m);
Vector *vector_alloc1(Matrix *mat);
void vector_free(Vector *v);
+void vector_free_many(size_t argcount, ...);
void vector_print(const Vector *v);