c - 将字符串数组从 C 返回到 Fortran
问题描述
我正在尝试使用“iso_c_binding”将字符串数组从 C 返回到 Fortran。该程序编译,但给出了运行时错误。我的 C 程序:
#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);
}
我的调用 Fortran 程序
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
当我运行它时,我收到以下错误。
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)
我不熟悉在 iso_c_binding 中使用指针。您能否指出为什么指针没有返回到 Fortran 程序?在此先感谢您的帮助
解决方案
您将更arr2
改为指向本地数组arr1
,然后返回本地数组的地址。
那是行不通的。arr1
函数返回后无效。
推荐阅读
- python - 如何使用 Python 快速解压缩 S3 存储桶中的大型 zip 文件,同时减少内存使用
- mysql - Mysql BEFORE UPDATE 触发更改大表上的许多(但不是全部)列
- macos - 删除文件后无法打开 VSCode
- android - 重新选择底部导航选项卡后Android清除后台堆栈
- r - 如何在tidyverse中使用separate来拆分列?
- python - python包中模块的相互依赖关系
- python - gdal.SetGCPs() 使用的默认转换技术是什么?如何更改使用的转换?
- python - 如何在odoo中发送带有报告的电子邮件
- pypi - 我的 PyPI 发行版只安装 dist
- python - 使用 python - 从嵌套的 Json 文件中读取数据并插入到 PostgreSQL 表中