Skip to content
Snippets Groups Projects
Select Git revision
  • 3D
  • master default protected
2 results

vector.c

Blame
  • vector.c 1.66 KiB
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "vector.h"
    
    double_vector_t *init_vector(uint_t N)
    {
        double_vector_t *vec = malloc(sizeof(double_vector_t));
        vec->components = malloc(N * sizeof(double));
        vec->N = N;
        if (vec == NULL)
        {
            perror("Can't allocate memory");
            exit(EXIT_FAILURE);
        }
        return vec;
    }
    double_vector_t *iota(uint_t N)
    {
        double_vector_t *vec = init_vector(N);
        for (uint_t i = 0; i < N; i++)
        {
            vec->components[i] = i;
        }
        return vec;
    }
    double_vector_t *apply_function(double_vector_t *vec, double_function_t f)
    {
        double_vector_t *res = init_vector(vec->N);
        for (uint_t i = 0; i < vec->N; i++)
        {
            res->components[i] = f(vec->components[i]);
        }
        return res;
    }
    void fill_vector(double_vector_t *vec, double value)
    {
        for (uint_t i = 0; i < vec->N; i++)
        {
            vec->components[i] = value;
        }
    }
    void export_vector(const char *filename, double_vector_t *vec)
    {
        FILE *output = fopen(filename, "w");
    
        uint_t endianness = 0x01020304;
        vector_metadata_t metadata;
        // Return the endianness by accessing the first byte in memory
        // which should be 1 if big-endian and 4 if little-endian
        metadata.endianness = *((byte_t *)(&endianness)) == 4;
        metadata.size_of_a_component = sizeof(double);
        metadata.number_of_component = vec->N;
    
        fwrite(&metadata, sizeof(vector_metadata_t), 1, output);
        fwrite(vec->components,
               metadata.size_of_a_component,
               metadata.number_of_component,
               output);
    
        fclose(output);
    }
    
    void destroy_vector(double_vector_t **vec)
    {
        free((*vec)->components);
        free(*vec);
        *vec = NULL;
    }