Gaius will probably answer this with the specific parameter passing and foreign function interfacing conventions used by GM2, but I would like to recommend a different approach which is to use open array parameters.
The actual number of array components of an open array parameter is passed as a hidden parameter before the open array parameter.
PROCEDURE P ( str : ARRAY OF CHAR );
is actually
PROCEDURE P ( count : CARDINAL; str : ARRAY OF CHAR );
and in C
void p ( unsigned argc, char str[] );
This convention is pretty universal for most if not all Modula-2 compilers and thus its use is portable.
When using specific array types, varying parameter passing conventions will apply depending on the compiler and even use cases, for example, a compiler or its optimising back-end may decide to pass fixed arrays exceeding a certain size by reference even if they aren't VAR parameters. The code will then become more difficult to maintain and non-portable.
regards
benjamin