Array#

A collection of array data types that are boxed in a struct. The struct holds the length of the array such that this can be passed as an argument and received from functions. The header also provides a makro to determine the size of arrays.

Reference#

UZ_ARRAY_SIZE(x)#

Standard macro to get the size of a array at compile time. See:

struct uz_array_float_t#

Array of floats with length to pass and receive from functions.

Public Members

uint32_t length#

length of the vector - use UZ_ARRAY_SIZE makro to determine

float *data#

pointer to data

struct uz_array_uint32_t#

Array of uint32_t with length to pass and receive from functions.

Public Members

uint32_t length#

length of the vector - use UZ_ARRAY_SIZE makro to determine

uint32_t *data#

pointer to data

struct uz_array_int32_t#

Array of int32_t with length to pass and receive from functions.

Public Members

uint32_t length#

length of the vector - use UZ_ARRAY_SIZE makro to determine

int32_t *data#

pointer to data

struct uz_array_int16_t#

Array of int16_t with length to pass and receive from functions.

Public Members

uint32_t length#

length of the vector - use UZ_ARRAY_SIZE makro to determine

int16_t *data#

pointer to data

struct uz_array_uint16_t#

Array of uint16_t with length to pass and receive from functions.

Public Members

uint32_t length#

length of the vector - use UZ_ARRAY_SIZE makro to determine

uint16_t *data#

pointer to data

The structs are typedefed.

Example#

Declare an array with data in it, then assign the first element of the array to the .data struct member. Pass the array to a function. Take the storage duration into account when assigning the pointer to .data.

void examplefunction(void){
    float data[5] = {1.12f, 2.87f, 3.3f, 4.6f, 51.5f};
    uz_array_float_t testarray = {
        .length = UZ_ARRAY_SIZE(data), // ALWAYS use the UZ_ARRAY_SIZE makro in the initialization of the length of the array
        .data = &data[0] // Pointer to the first element of the actual data of the array
    };
    float sum=sum_over_array(testarray); // enables to pass array with length of array
}

float sum_over_array(uz_array_float_t array){
    float sum=0.0f;
    for(uint32_t i=0;i<array.length;i++){
        sum+=array.data[i];
    }
    return sum;
}

Danger

If a variable is declared inside of a function and the pointer to this variable (automatic storage duration) is assigned to .data, the uz_array must not be returned to a calling function.

This leads to buggy code, do not do this:

void fcn(void){

uz_array_float_t var=a_buggy_function(void);
}

float a_buggy_function(void){
    float data[5]={1,2,3,4,5};
    uz_array_float_t array{
        .length=UZ_ARRAY_SIZE,
        .data=&data[0]
    };
    return array;
}