fortran66のブログ

fortran について書きます。

■[Fortran2003]チラシ裏 C_F_POINTER

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