Ram
Ram

Reputation: 51

Returning string arrays from C into Fortran

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

Answers (1)

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

Related Questions