Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';将Fortran零长度数组传递给C的正确方法是什么?_C_Arrays_Fortran_Fortran Iso C Binding - Fatal编程技术网

什么';将Fortran零长度数组传递给C的正确方法是什么?

什么';将Fortran零长度数组传递给C的正确方法是什么?,c,arrays,fortran,fortran-iso-c-binding,C,Arrays,Fortran,Fortran Iso C Binding,我有下面一种子程序包装器,用于将Fortran数组传递给ISO_C_BINDING绑定的C函数 subroutine mysub( array ) integer, dimension(:) :: array call f_mysub( size(array) , array(1) ) end subroutine 问题是,如果数组的大小为0,则array(1)超出范围。处理这种情况的正确方法是什么 一般来说,我无法避免调用,即使用if(size(array)>0),因为调用可能对注册

我有下面一种子程序包装器,用于将Fortran数组传递给
ISO_C_BINDING
绑定的C函数

subroutine mysub( array )
  integer, dimension(:) :: array
  call f_mysub( size(array) , array(1) )
end subroutine
问题是,如果数组的大小为0,则
array(1)
超出范围。处理这种情况的正确方法是什么

一般来说,我无法避免调用,即使用
if(size(array)>0)
,因为调用可能对注册很重要,例如,它实际上是一个类方法,自然具有与上述不同的签名,并且可以清除现有数组

示例文件 C例程是
C_mysub.C

#include <stdio.h>
void c_mysub( size_t* size, int* arr )
{
    printf("size=%d\n",*size);
    for(size_t i=0; i<*size; ++i)
    {
        printf("element %d=%d\n",i,arr[i]);
    }
}
gcc-C C C_mysub.C
编译C,用
gfortran-fbounds编译Fortran,检查C_mysub.o mysub.f90
,运行代码时会出现以下错误,在第二次调用size=0时会犹豫

size=7
0:1
1:1
2:1
3:1
4:1
5:1
6:1
At line 18 of file mysub.f90
Fortran runtime error: Index '1' of dimension 1 of array 'array' above upper bound of 0
使用边界检查进行编译的行为符合预期

size=7
0:1
1:1
2:1
3:1
4:1
5:1
6:1
size=0

我看不出有任何理由将
数组(1)
作为实际参数传递。应传递整个数组
array

  call f_mysub( size(array) , array )
并且必须更改接口以传递数组而不仅仅是标量

  integer(C_INT) :: arr(*)
如果
数组
不是连续的,则传递第一个元素(甚至传递给数组参数)很容易导致错误行为-这在理论上是可能的,因为它是假定的形状伪参数(带有
(:)


如果传递整个数组并调整大小
0
,则只需确保在C过程中没有任何元素实际从指针上取消引用(如果编写得很好,应该已经是这种情况)。

如果数组为空,则可以临时将数组调整为1。。。。或者准备一个虚拟数组以备不时之需。
c_mysub
的接口是什么?为什么要将标量数组元素传递给它,即使该数组可能没有元素?为了备份francescalus,为什么不传递该数组?通常应该只传递
array
,而不是
array(1)
。如果不显示真实代码,很难说更多。存在
array
不连续的风险,而
array(1)
将避免创建临时副本,这实际上可能是错误的。在这种情况下,f_mysub看起来像什么?
c_mysub
将有
int[]arr
作为参数,对吗?现在我只意识到你有一个错误的接口,你必须纠正它。c参数可以是数组或指针,这不重要
int*array
很好。是不是零大小的数组不能与任何C数组互操作?我只是想检查一下。可能不是。但实际上,无论传递的地址是什么,都不应该取消引用。甚至可以传递空指针。我们可以添加一个if并传递一个
c\u null\u指针,但我认为这不值得。我只需要检查Fortran端是否发生了不好的事情。
  integer(C_INT) :: arr(*)