Cray Pointer
CHARACTER (512) :: buff INTEGER(C_SIZE_T)::ibuff ! optional ? ! C_SIZE_T = 8byte POINTER(ibuff, buff) ! nerr = cudaGetLastError() ibuff = cudaGetErrorString( nerr )
Fortran2003 呼び出し順序に注意する。C_PTR から F_PTR への一方通行?
CHARACTER (512), POINTER :: buff TYPE (C_PTR) :: ibuff ! nerr = cudaGetLastError() ibuff = cudaGetErrorString( nerr ) ! CALL C_F_POINTER(ibuff, buff)
■text
#include<stdio.h> static char a[10] = {'a', 'b', 'c', '\0'}; char* csub() { printf("%s\n", a); return (a); }
CHARACTER 宣言文は、(LEN, KIND) の順。
PROGRAM test USE, INTRINSIC :: ISO_C_BINDING IMPLICIT NONE TYPE (C_PTR) :: cptr INTEGER :: n INTEGER, POINTER :: nn CHARACTER (10, C_CHAR), POINTER :: text INTERFACE TYPE (C_PTR) FUNCTION csub() BIND(C, name='csub') USE, INTRINSIC :: ISO_C_BINDING END FUNCTION csub END INTERFACE cptr = csub() CALL C_F_POINTER( cptr, text ) n = INDEX(text, ACHAR(0)) - 1 PRINT *, n, text(1:n) STOP END PROGRAM test
■integer array
#include<stdio.h> #include<stdlib.h> static int *p, *pp; int* csub(int n) { int i; p = (int*) calloc(n, sizeof(int)) ; pp = p; for (i = 0; i < n; i++) { *pp = i; printf("%d, %d\n", n, *pp); pp++; } return p; }
PROGRAM test USE, INTRINSIC :: ISO_C_BINDING IMPLICIT NONE ! INTERFACE TYPE (C_PTR) FUNCTION csub(n) BIND(C, name='csub') USE, INTRINSIC :: ISO_C_BINDING INTEGER, VALUE, INTENT(IN) :: n END FUNCTION csub END INTERFACE ! TYPE (C_PTR) :: cptr INTEGER, POINTER :: nn(:) INTEGER :: n = 10 ! cptr = csub( n ) CALL C_F_POINTER( cptr, nn, [n] ) PRINT *, nn STOP END PROGRAM test