diff options
author | Jasper | 2025-09-09 12:16:26 +0200 |
---|---|---|
committer | Jasper | 2025-09-09 12:16:26 +0200 |
commit | 5fd2f59d9f30253cb0c64a06a4a305e90b89e3ae (patch) | |
tree | 1fa55449eb91489a428eeb48307d7d314b208860 | |
parent | 29f92b1c7dad80b40654f561fbe82f5c1d9df7b2 (diff) |
Variadic functions to free matrices/vectors
Renamed 'matrix_freen' to 'matrix_free_many1'. Frees a dynamic array of
matrices.
-rw-r--r-- | debug.c | 3 | ||||
-rw-r--r-- | matrix.c | 15 | ||||
-rw-r--r-- | matrix.h | 3 | ||||
-rw-r--r-- | tests.c | 11 | ||||
-rw-r--r-- | vector.c | 13 | ||||
-rw-r--r-- | vector.h | 1 |
6 files changed, 38 insertions, 8 deletions
@@ -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) @@ -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; @@ -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); @@ -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() @@ -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); @@ -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); |