View previous topic :: View next topic |
Author |
Message |
StamK
Joined: 12 Oct 2016 Posts: 162
|
Posted: Wed Jun 02, 2021 2:09 pm Post subject: ISO_C_BINDING |
|
|
Is this implemented fully?
For example C_F_POINTER doesn't seem to be recognised. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Wed Jun 02, 2021 5:41 pm Post subject: |
|
|
StamK
Fortran 2003 ISO_C_BINDING is implemented except for the intrinsics C_ASSOCIATED, C_F_POINTER and C_F_PROCPOINTER. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Thu Jun 03, 2021 7:21 am Post subject: |
|
|
StamK
Do you have code that uses C_F_POINTER. Can you post a sample? |
|
Back to top |
|
|
StamK
Joined: 12 Oct 2016 Posts: 162
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Sat Jun 19, 2021 7:42 am Post subject: |
|
|
StamK
If you are using only FTN95 then there will probably be a fix that we could provide. Alternatively we may be able to implement C_F_POINTER for you.
Either way we would need some sample code that illustrates what you want to do. |
|
Back to top |
|
|
StamK
Joined: 12 Oct 2016 Posts: 162
|
Posted: Sun Jun 20, 2021 12:06 pm Post subject: |
|
|
We just want to develop our own malloc/free Fortran calls, and iso_c_binding allows to use the C pointers seamlessly. In any case C_F_POINTER is a very important element of iso_c_binding so it is important to get it to work. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Sun Jun 20, 2021 12:34 pm Post subject: |
|
|
StamK
Can you post some code that illustrates how C_F_POINTER is used. |
|
Back to top |
|
|
StamK
Joined: 12 Oct 2016 Posts: 162
|
Posted: Sun Jun 20, 2021 1:00 pm Post subject: |
|
|
Courtesy of https://stackoverflow.com/questions/19147743/passing-allocatable-array-from-fortran-to-c-and-malloc-it
Code: |
#include "stdlib.h"
int *create_storage()
{
/* Array of four integers. */
return malloc(sizeof(int) * 4);
}
void destroy_storage(int *ptr)
{
free(ptr);
}
PROGRAM fortran_side
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER, C_INT
IMPLICIT NONE
INTERFACE
FUNCTION create_storage() BIND(C, NAME='create_storage')
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR
IMPLICIT NONE
TYPE(C_PTR) :: create_storage
END FUNCTION create_storage
SUBROUTINE destroy_storage(p) BIND(C, NAME='destroy_storage')
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR
IMPLICIT NONE
TYPE(C_PTR), INTENT(IN), VALUE :: p
END SUBROUTINE destroy_storage
END INTERFACE
TYPE(C_PTR) :: p
INTEGER(C_INT), POINTER :: array(:)
!****
p = create_storage()
CALL C_F_POINTER(p, array, [4]) ! 4 is the array size.
! Work with array...
CALL destroy_storage(p)
END PROGRAM fortran_side
|
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Mon Jun 21, 2021 10:01 am Post subject: |
|
|
StamK
This code suggests to me that C_F_POINTER is equivalent to the FTN95 extension of using ABSOLUTE_ADDRESS with ALLOCATE...
ALLOCATE(array(4), ABSOLUTE_ADDRESS=p)
but I wonder why you would want to do this rather than simply call ALLOCATE(array(4)).
Also if GET_STORAGE@ does not work for you then we should look into that. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Mon Jun 28, 2021 10:19 am Post subject: |
|
|
StamK
In the next release of the FTN95 library, the 64 bit definition of GET_STORAGE@ has been improved. You have reported that GET_STORAGE@ was not working for you and this change may make a difference.
This change will be in the next release of the DLLs. |
|
Back to top |
|
|
StamK
Joined: 12 Oct 2016 Posts: 162
|
Posted: Fri Apr 28, 2023 1:07 pm Post subject: |
|
|
Hi, is the implementation of C_ASSOCIATED going to happen any time soon?
Thanks |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Fri Apr 28, 2023 2:46 pm Post subject: |
|
|
StamK
I will put it on the wish list. I can't say when it will be implemented at the moment. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Sun May 07, 2023 9:15 am Post subject: |
|
|
StamK
I have had a look at C_F_POINTER and my initial impression is that it will be a major task to add it to FTN95.
If you are having problems with GET_STORAGE@ then I am sure that it would be a lot quicker for us to fix that issue or for us to provide an alternative direct method for getting memory.
Please provide code that illustrates your problems when getting memory. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8019 Location: Salford, UK
|
Posted: Sun May 07, 2023 1:57 pm Post subject: |
|
|
If you are writing a program for a Windows operating system then a call to get memory will almost certainly end up with a call to the Windows API function HeapAlloc.
This will be the case, for example, if you call ALLOCATE from Fortran, GET_STORAGE@ from FTN95 or malloc from a program written in the language C.
Here is a simple FTN95 program that illustrates how to directly call HeapAlloc.
Code: | PROGRAM main
STDCALL HeapAlloc 'HeapAlloc' (VAL7,VAL3,VAL7):INTEGER(7)
STDCALL GetProcessHeap 'GetProcessHeap':INTEGER(7)
STDCALL HeapFree 'HeapFree' (VAL7,VAL3,VAL7):INTEGER*4
INTEGER(7):: han,addr
INTEGER,PARAMETER:: HEAP_ZERO_MEMORY=8
INTEGER ret
han = GetProcessHeap()
addr = HeapAlloc(han, HEAP_ZERO_MEMORY, 1024_7)
IF(addr > 0) write(*, "(A,2Z8)") " 1024 bytes of memory allocated:",han,addr
ret = HeapFree(han, 0, addr)
IF(ret /= 0) write(*,*) "Memory has been de-allocated"
END PROGRAM |
|
|
Back to top |
|
|
|