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.
-
struct uz_array_uint32_t#
Array of uint32_t with length to pass and receive from functions.
-
struct uz_array_int32_t#
Array of int32_t with length to pass and receive from functions.
-
struct uz_array_int16_t#
Array of int16_t with length to pass and receive from functions.
-
struct uz_array_uint16_t#
Array of uint16_t with length to pass and receive from functions.
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;
}