control the life of a C struct from fortran.

cyril giraudon cyril.giraudon@free.fr
Thu Dec 18 21:03:00 GMT 2008


Daniel Franke a écrit :
> On Thursday 18 December 2008 16:20:13 cyril giraudon wrote:
>   
>> I 'd like to whether it is possible to create a c_ptr in fortran and tp
>> control its life with c function.
>> The standard is not very clear about c_ptr.
>>     
>
> Short answer: yes, it's possible.
>
> Longer answer: the prototype of person_alloc() doesn't work as shown. You 
> either have to have a pointer-to-pointer argument (person**), or return the 
> allocated pointer (in your version, free() doesn't get the p-pointer you 
> allocated before, but some random position in memory):
>
>   person* person_alloc() {
>     person *p = malloc(sizeof(person));
>     p->age = 42;
>     return p;
>   }
>
> The (working) fortran side then looks like this:
>
>   USE ISO_C_BINDING, ONLY: c_ptr
>   INTERFACE
>     FUNCTION person_alloc() BIND(c, name="person_alloc")
>       IMPORT c_ptr
>       type(c_ptr) :: person_alloc
>     END FUNCTION
>     SUBROUTINE person_free(p) BIND(c, name="person_free")
>       IMPORT c_ptr
>       type(c_ptr), VALUE :: p
>     END SUBROUTINE
>     SUBROUTINE person_age(p) BIND(c, name="person_age")
>       IMPORT c_ptr
>       type(c_ptr), VALUE :: p
>     END SUBROUTINE
>   END INTERFACE
>
>   TYPE(C_PTR) :: p
>   p = person_alloc()
>   CALL person_age(p)
>   CALL person_free(p)
> end
>
>
> Enjoy
>
> 	Daniel
>
>
> P.S. This is not a general Fortran mailing-list, but for gfortran and its 
> development only. Your question was not exactly gfortran-specific ...
>
>
>
>   
Thanks a lot, it works very well.

I 'm sorry for posting in the wrong list, I 'm going to see for a more 
appropriate mailing-list.

Cyril.



More information about the Fortran mailing list