gm2
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Passing parameters of type 'ARRAY[0..MAXINDEX] OF ElementType' to C


From: Rudolf Schubert
Subject: Re: Passing parameters of type 'ARRAY[0..MAXINDEX] OF ElementType' to C
Date: Sun, 28 Jan 2024 21:28:14 +0100 (CET)

Hi Benjamin,

yes, you're right, it is probably best to use open array parameters to
avoid problems here. It was just that I had used 'none open' array parameters
(with GPM) and did notice that GM2 'disappointed my expectations';-)

BTW, are you sure the hidden parameter is passed BEFORE the open
array parameter? At least with GPM and GM2 I use several C functions
where the (hidden) high value is passed AFTER the open array parameter.
So my C function would look like this:

void p ( char str[], unsigned argc );


BR

Rudolf

--
Rudolf Schubert                 \
Kirchstr. 18a                    \  mailto:rudolf@muc.de
82054 Sauerlach                   > http://www.dose.muc.de
Deutschland                      /   (alpine archkiste)
Tel. 08104/908311               /


On Mon, 29 Jan 2024, Benjamin Kowarsch wrote:

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

On Sun, 28 Jan 2024 at 22:03, Rudolf Schubert <rudolf@muc.de> wrote:
               High Gaius,

               I'm facing a problem when trying to pass a parameter of typ 
String256
               to C, which I've defined like this:

               CONST
                 len256=                       256;
               TYPE
                 String256=                    ARRAY[0..len256-1] OF CHAR;

               In the appended example I've set up three DEFINITION MODULEs
               (unix1.def, unix2.def, unix3.def) each with a corresponding
               C file (unix1.c, unix2.c, unix3.c). There is only one simple
               function in these C files which should print out the length
               of the passed string and the string proper.

               unix1.def does NOT have 'FOR "C"' whereas unix2.def and unix3.def
               do have a 'FOR "C"' in the MODULE definition. In unix1.def and 
unix2.def
               the PROCEDURE ParamTest has got (my_str: String256) but in 
unix3.def
               I'm using 'varargs' (...).

               I'm seeing that only unix3 does give the expected results. unix1 
and
               unix2 do either crash the programm or return wrong results.

               I do observe similar behaviour not only for

               type 'ARRAY[0..MAXINDEX] OF CHAR'

               but for instance also for

               type 'ARRAY[0..MAXINDEX] OF CARDINAL'

               Now my question is: how would I pass parameters of this type to
               C functions? I would suspect that this should not only work for
               'varargs' but also in the other cases? When using open ARRAYs in
               the PROCEDURE things are also working fine. It's just when using
               'non open' ARRAYs that the problem occurs.

      BR

      Rudolf

      --
      Rudolf Schubert                 \
      Kirchstr. 18a                    \  mailto:rudolf@muc.de
      82054 Sauerlach                   > http://www.dose.muc.de
      Deutschland                      /   (alpine archkiste)
      Tel. 08104/908311               /



reply via email to

[Prev in Thread] Current Thread [Next in Thread]