Reputation: 51
I am trying to return an array of strings from C into Fortran using "iso_c_binding". The program compiles, but gives a run-time error. My C program :
#include <stdio.h>
void ret_array(int * numStrings, char **arr2 ) {
int dim1=5;
char *arr1[5]={"name1","name2","name3","name4","name5"};
arr2 = &arr1;
printf("%s\n",arr2[0]);
printf("%s\n",arr2[1]);
printf("%s\n",arr2[2]);
printf("%s\n",arr2[3]);
printf("%s\n",arr2[4]);
numStrings = &dim1;
printf("%s","Ending interface :");
fflush(stdout);
}
My calling Fortran program
program main
implicit none
CHARACTER(LEN = 255), dimension(:), allocatable:: str2
integer(kind = 4):: istr
call get_arr(istr, str2)
PRINT *, str2(1)
contains
subroutine get_arr(n, str1)
use iso_c_binding
implicit none
INTEGER(KIND = 4):: n
CHARACTER(LEN = 255), dimension(:), ALLOCATABLE:: str1
character(kind = c_char), pointer:: fptr(:)
TYPE(C_PTR), DIMENSION(:), allocatable:: cptr
integer:: len1, ii
interface
subroutine ret_array(dim_len, str_arr1) bind(c)
use iso_c_binding
integer(c_int), INTENT(OUT):: dim_len
TYPE(C_PTR), DIMENSION(:,:), intent(out):: str_arr1
end subroutine
end interface
call ret_array(n, cptr)
PRINT *,"Number :",n
allocate(str1(n))
do ii = 1, n
call c_f_pointer(cptr(ii), fptr, [ 255 ])
len1 = index(fptr(ii), C_NULL_CHAR)
PRINT *,len1
str1(ii) = TRANSFER(fptr(1:len1-1), str1(ii))
end do
end subroutine
end program
When I run it, I get the following error.
name1
name2
name3
name4
name5
Ending interface :
Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7f9e86776d01 in ???
#1 0x7f9e86775ed5 in ???
#2 0x7f9e865aa20f in ???
#3 0x7f9e869aa077 in ???
#4 0x55e9a5195350 in get_arr
at /home/test/fort_code/ret_arr.f90:27
#5 0x55e9a5195984 in MAIN__
at /home/test/fort_code/ret_arr.f90:6
#6 0x55e9a5195a37 in main
at /home/test/fort_code/ret_arr.f90:7
make: *** [Makefile:3: run] Floating point exception (core dumped)
I am new to using pointers in iso_c_binding. Can you please point out why the pointer is not being returned to Fortran program? Thanks in advance for your help
Upvotes: 5
Views: 200
Reputation: 59999
You are changing arr2
to point to the local array arr1
and then returbning the address of the local array.
That cannot work. arr1
is not valid after the function returns.
Upvotes: 1