Hello, Rory, 
I believe the use of two names makes complete sense. The myStruct declaration 
generates the necessary bigloo glue to create and access the described c 
structure. It can only do this with dynamically allocated memory so the 
resulting type has * appended. On the other hand, the myStructArr declaration 
provides the glue to create and manipulate arrays of myStruct structures. These 
are very different things and just because C's representation of dynamically 
allocated arrays and singly, dynamically allocated structs are syntactically 
the same does not mean they should be in general. In fact, I think using the 
two separate types below is clearer in intent; I cannot be confused on whether 
I am dealing with a collection of structs or a single instance.
 Best Regards,Joe
 
      From: Rory Mulvaney <[email protected]>
 To: "[email protected]" <[email protected]> 
Cc: Rory Mulvaney <[email protected]> 
 Sent: Tuesday, November 3, 2015 7:44 AM
 Subject: Re: [bigloo] how to allocate an array of C structs?
   
I see, thanks Joe, that's right.  Sorry for taking awhile to respond. 
Still though, it may be a little inconvenient to create a new name just 
for the typename of the dynamically allocable struct.  However, this 
workaround is definitely functional.

Thanks and regards,
Rory




On Mon, 19 Oct 2015, Joseph Donaldson wrote:

> Hello, Rory,
> 
> Using your aStruct.h, the code below works for me. I believe the problem 
> with the original code is name clash between your bigloo struct and 
> pointer declarations. The struct declaration creates a type named 
> myStruct* which masks your pointer type declaration using the same name.
> 
> Best Regards,
> Joe
> 
>  
> (module cstructarrays
>    (main main)
>    (extern
>       (include "aStruct.h")
>       (type myStruct (struct
> (elt1::int "elt1")
>                          (elt2::int "elt2")
>                          (elt3::int "elt3")
>                          ) "myStruct")
>       (type myStructArr (pointer myStruct) "myStruct*")))
> 
> 
> (define (main args)
>    (let ((arr (make-myStructArr 4)))
>       (do ((i 0 (+ i 1)))
>  ((= i 4))
>  (myStruct*-elt1-set! (myStructArr-ref arr i) i))
>       (do ((i 0 (+ i 1)))
>  ((= i 4))
>  (print (myStruct*-elt1 (myStructArr-ref arr i))))))
> 
> 
> ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
>      From: Rory Mulvaney <[email protected]>
>      To: [email protected]
>      Sent: Tuesday, October 13, 2015 8:22 AM
>      Subject: [bigloo] how to allocate an array of C structs?
> 
> Bigloo community,
> 
> I don't see a way to allocate an array of C structs.  If I have a C struct
> called "myStruct", I think I should be able to use (make-myStruct* 3) to
> return a pointer to a newly-allocated array of 3 myStructs.  However, it
> seems the only way to allocate a new C struct is to allocate them 1 at a
> time, using (myStruct* elt1 elt2 elt3).
> 
> http://www-sop.inria.fr/members/Manuel.Serrano/bigloo/doc/bigloo-28.html#The-C-interface
> (see sections on Struct and Union types and section on C pointers)
> 
> This is what I have:
> 
> [aStruct.h:
> 
> typedef struct myStruct {
>   int elt1;
>   int elt2;
>   int elt3;
> } myStruct;
> 
> ]//end of aStruct.h
> 
> (module aStruct
>         (main testAStruct)
>         (extern
>         (include "aStruct.h")
>         (type myStruct (struct
>                         (elt1::int "elt1")
>                         (elt2::int "elt2")
>                         (elt3::int "elt3")
>                         ) "myStruct")
>         ;; automatically defined
>         ;; (type myStruct* (pointer myStruct) "myStruct*")
>         )
>         )
> 
> (define (testAStruct argv)
>   ; doesn't work                                                             
>   ; (make-myStruct* 3)                                                       
>   ; works                                                                     
>   (myStruct* 1 2 3)
> 
> )
> 
> Thanks and regards,
> Rory
> 
> 
> 
> 

   

Reply via email to