Arrays
// Arrays
/*
Array type is special composit type containing multiple values of the
same base type. We must explicitly specify how many elements could
an array contain.
my_array: [5]s32;
You can use [N-1] operator to modify or read each array element but keep
in mind that we have only limited count of them specified in type
array type definition.
my_array[0] = 10;
my_array[1] = 20;
Our example array of size 5 have memory reserved for 5 elements. Indices
of those elements are counted from 0, so maximum posible index is 4.
Compiler will internally allocate continuous memory block on stack with
propper size. So index 0 points to the very beginning of this memory
block, index 1 points to memory block of next element.
You can get address of allocated memory block via '.ptr' array member
field and length of an array via '.len' field.
N = 5
my_array.len -> yields 5 of s64 type
my_array.ptr -> yields address of element on 0 index of type *s32
1st 2nd 3rd 4th 5th
---------------------
| 0 | 1 | 2 | 3 | 4 |
---------------------
^ .ptr
*/
main :: fn () s32 {
// This is array variable as consist of 10 numbers of s32 type.
// In this case we do not initialize the array we only reserve
// memory enough to handle all values.
my_array: [10]s32;
// Use [n] to get or set array element value. Here we set the first
// (with index 0) to value 10.
my_array[0] = 10;
// Set the second element to 20.
my_array[1] = 20;
// You can use loop to iterate over all array elements one by one.
loop i := 0; i < my_array.len; i += 1 {
// Visit array element on index 'i' and set it's value to 'i'.
my_array[i] = i;
}
// Arrays can be printed directly by print function like this:
print("my_array is %\n", my_array);
// Arrays could be initialized in same way like other variables even in
// declaration by compound initializer. We can let compiler inver variable
// type here like we did with other variables in previous example.
another_array := {:[4]s32: 1, 2, 3, 4};
print("another_array is %\n", another_array);
// Use sizeof operator to determinate size of any type or variable used.
// In this case sizeof(another_array) returns size of allocated memory
// block to handle all integers.
// Get size from value.
s1 :: sizeof(another_array);
print("sizeof(another_array) is %B\n", s1);
// Get size from type.
s2 :: sizeof([4]s32);
print("sizeof([4]s32) is %B\n", s2);
// sizeof is very useful operator especially in cases we want to know
// how much space we need to allocate for value of desired type, but
// there are more use cases of this.
return 0;
}