Module PetscF2003_Interface use,intrinsic :: iso_c_binding #include "finclude/petscdef.h" use petsc interface function PetscOptionsGetEnum(pre,name,list,value,set) bind(c,name='PetscOptionsGetEnum') use,intrinsic :: iso_c_binding character(kind=c_char) :: pre,name Type(C_Ptr),dimension(*) :: list PetscInt :: value PetscBool :: set PetscErrorCode :: PetscOptionsGetEnum end function PetscOptionsGetEnum end interface End Module PetscF2003_Interface Module StringArrayConvert #include "finclude/petscdef.h" use petsc use PetscF2003_Interface Contains #undef __FUNCT__ #define __FUNCT__ "FCharArrayToCPtr1" ! This routine leaks CAddressArray. ! Would you prefer the user allocates the address list first? Subroutine FCharArrayToCPtr1(FortranCharArray,CAddressArray,ierr) use,intrinsic :: iso_c_binding Character(kind=C_char,len=*),Dimension(:),Pointer :: FortranCharArray Type(C_Ptr),Dimension(:),Pointer :: CAddressArray PetscErrorCode,intent(out) :: ierr character(kind=c_char),pointer :: nullc => null() PetscInt :: i,numVal numVal = size(FortranCharArray) Allocate(CAddressArray(numVal+1),stat=ierr) CAddressArray = (/ (c_loc(FortranCharArray(i)), i = 1,numVal),c_loc(nullc) /) End Subroutine FCharArrayToCPtr1 End Module StringArrayConvert Program PetscF2003 #include "finclude/petscdef.h" use petsc use StringArrayConvert use,intrinsic :: iso_c_binding implicit none PetscErrorCode :: ierr Character(kind=C_char,len=99) :: pre1,name1 Character(kind=C_char,len=99),Dimension(:),Pointer :: list1 Type(C_Ptr),Dimension(:),Pointer :: list PetscInt :: opt=-1 PetscBool :: set=PETSC_FALSE Call PetscInitialize(PETSC_NULL_CHARACTER,ierr);CHKERRQ(ierr) Allocate(list1(5),stat=ierr);CHKERRQ(ierr) list1(1) = "a123"//C_NULL_CHAR list1(2) = "b456"//C_NULL_CHAR list1(3) = "c789"//C_NULL_CHAR list1(4) = "list1"//C_NULL_CHAR list1(5) = C_NULL_CHAR pre1 = "list1_"//C_NULL_CHAR name1 = "-name1"//C_NULL_CHAR Call FCharArrayToCPtr1(list1,list,ierr);CHKERRQ(ierr) ierr = PetscOptionsGetEnum(pre1,name1,list,opt,set);CHKERRQ(ierr) write(*,*) 'opt is ', opt write(*,*) 'set is ', set DeAllocate(list1) Call PetscFinalize(ierr) End Program PetscF2003