From 5fd2f59d9f30253cb0c64a06a4a305e90b89e3ae Mon Sep 17 00:00:00 2001 From: Jasper Date: Tue, 9 Sep 2025 12:16:26 +0200 Subject: Variadic functions to free matrices/vectors Renamed 'matrix_freen' to 'matrix_free_many1'. Frees a dynamic array of matrices. --- debug.c | 3 +-- matrix.c | 15 ++++++++++++++- matrix.h | 3 ++- tests.c | 11 +++++++---- vector.c | 13 +++++++++++++ vector.h | 1 + 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 #include #include +#include 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 +#include 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 #include #include +#include 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); -- cgit v1.2.3