#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
/* VARIANT 3: instead of using a 2D array to represent a matrix,
a custom type is used. That makes it easier/nicer to pass
matrices around various places in your code. */
typedef struct {
unsigned int rows;
unsigned int columns;
int *elements;
} matrix;
matrix matrix_new(unsigned int rows, unsigned int columns)
{
matrix mat;
mat.rows = rows;
mat.columns = columns;
mat.elements = calloc(rows * columns, sizeof(int)); /* zero matrix */
return mat;
}
bool matrix_clear(matrix *mat)
{
if (mat == NULL)
return false;
mat->rows = 0;
mat->columns = 0;
free(mat->elements);
mat->elements = NULL;
return true;
}
bool matrix_elem(matrix *mat, unsigned int row, unsigned int column, int val)
{
if (mat == NULL)
return false;
if (row >= mat->rows || column >= mat->columns)
return false;
if (mat->elements == NULL)
return false;
mat->elements[row * mat->columns + column] = val;
return true;
}
bool matrix_compare(const matrix *mat0, const matrix *mat1)
{
if (mat0 == NULL || mat1 == NULL)
return false;
if (mat0->rows != mat1->rows)
return false;
if (mat0->columns != mat1->columns)
return false;
int *a = mat0->elements;
int *b = mat1->elements;
unsigned int i = mat0->rows * mat0->columns;
while (i--) {
if (*a++ != *b++) {
return false;
}
}
return true;
}
int main(void)
{
matrix mat3 = matrix_new(3, 3);
matrix mat4 = matrix_new(3, 3);
matrix mat5 = matrix_new(3, 3);
matrix_elem(&mat3, 1, 1, 12);
matrix_elem(&mat4, 1, 1, 12);
matrix_elem(&mat5, 1, 1, 13);
//matrix_copy_from_2d_array(&mat6, mat0); // todo
if (matrix_compare(&mat3, &mat4)) {
printf("VARIANT 3: mat3 and mat4 are equal!\n");
}
if (matrix_compare(&mat3, &mat5) == false) {
printf("VARIANT 3: mat3 and mat5 are NOT equal!\n");
}
matrix_clear(&mat3);
matrix_clear(&mat4);
matrix_clear(&mat5);
return 0;
}