7.3. Arrays¶
Vala arrays are designed to match most of the C array semantics. Since C arrays, generally, have no explicit length, Vala needs special hints to know what to do. There are several cases for the length of an array, discussed below. For a parameter, a CCode
attribute attached to that parameter controls the array’s binding. For a return value, the CCode
attribute of the method controls the array’s binding.
7.3.1. Array Length is Passed as an Argument¶
By default, Vala assumes the first case and does the following transformation:
void foo (double[] array);
double[] foo (float f);
void foo(double *array, int array_length);
double *foo(float f, int *array_length);
If the C code does this, there are still two potential mismatches: the order of parameters and the type of the array length. Often, the array length is a size_t
or unsigned int
. The array_length_pos
can move the position of the array’s length parameter, see Changing the Position of Parameters. The array_length_type
specifies a string with the C type of the array (e.g., size_t
).
7.3.2. Array is Null-Terminated¶
The array_null_terminated
will assume the array is null terminated, like a string is, and set the array length automatically by iterating over the items in the array. Since Vala always allocates padding in arrays with the final element as null, passing a Vala-declared array in does not involve modifying the array in any way.
7.3.3. Array Length is a Constant Expression¶
The array_length_cexpr
can be set to the C expression that populates the array’s value. It does not have access to the array, the instance of the object being called, or any other context. It must be a context-free expression.
7.3.4. Array Length is Unknown¶
If the array length is unknown, setting array_length = false
in the CCode
attribute will cause Vala to set the array’s .length
property to -1 and not pass the length when used as a parameter.
7.3.5. Array Length is Known by Some Awkward Means¶
This is only applicable for arrays being returned. If the array’s length can be determined, but non-trivially, a wrapper function can be included that sets the array’s .length property
to the correct value. See Array Lengths.