[M3devel] open array parameter passing, to external C procedure

Dragiša Durić dragisha at m3w.org
Tue Feb 7 13:17:28 CET 2012


Thanks to all for replies, it (does not) work as expected. Test showed it, reasoning is ok.

In gm2, interfacing is explicitly to C, so it's how it would and will work there. No big deal to make it by hand, but anyway - it's good to be sure :).

BTW, while googling some time ago, I found "ALIGNED  n FOR" construct from SPIN compiler… Interesting way to ensure alignment, esp in light of overaligning we have in cm3 now :).

dd

On Feb 6, 2012, at 5:43 PM, Rodney Bates wrote:

> All the compilers pass open arrays as a pointer to metadata.
> The metadata consists of a pointer to actual element zero, followed
> by a "shape", which is an array of element counts in each open dimension.
> The number of open dimensions is a static property of the type, so
> it is not passed, but hard-coded where needed. 
> 
> The actual elements can be anywhere, and indeed must be somewhere
> else in the case of a SUBARRAY.   
> 
> I suppose they could have made this into separate parameters for
> address of element zero and for each shape component, but I'm not 
> sure right off hand how that would interact with heap-allocated open
> arrays and subarrays of either heap-allocated or local variables.  
> I've been ambivalent about this representation, but it can be used
> consistently everywhere.  For a heap-allocated open array, the
> metadata is immediately followed by the elements.  
> 
> So, no, it won't work the way you hope.  For your example, you 
> would pass ADR(events[0]) and NUMBER(events) as separate parameters. 
> (ADR(events) would pass the address of the metadata.)    
> 
> Of course, usually, the array you will have is not necessarily entirely 
> full.  If that were the case, to do it in the Modula-3 way you had hoped, 
> you would have had to pass SUBARRAY(events,0,event_count).  As it is,
> the actuals in this case would be ADR(events[0]) and event_count.   
> 
> -Rodney Bates
> 
> --- dragisha at m3w.org wrote:
> 
> From: Dragiša Durić <dragisha at m3w.org>
> To: m3devel <m3devel at elegosoft.com>
> Subject: [M3devel] open array parameter passing, to external C procedure
> Date: Mon, 6 Feb 2012 09:50:51 +0100
> 
> I have this case:
> 
> extern int epoll_wait (int __epfd, struct epoll_event *__events,
>                       int __maxevents, int __timeout);
> 
> And I would like to do it like:
> 
> <*EXTERNAL*> 
> PROCEDURE epoll_wait (epfd: int; VAR events: ARRAY OF epoll_event; timeout: int := -1): int;
> 
>> VAR
>  events: ARRAY [0..MaxEvents-1] OF epoll_event;
> 
>> 
> WITH res = epoll_wait(epfd, events, 2) DO
>> END;
> 
> Can I expect cm3 to do "right thing". Or I have to place parameters "by hand" using ADR and SIZE?
> 
> TIA,
> dd
> 
> 
> 
> 
> 




More information about the M3devel mailing list