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