c - 无临时数组的fortran数组重塑

我正在把一些C函数读入的数据传递给一个Fortran过程,它将完成所有的数字运算。在Fortran中,数组自然被视为具有(2, nn)形状。由于C没有多维数组,因此该数组在C中被分配和使用,其长度2 * nn
我想在FORTRAN中重新排列数组,这样我就可以在数字代码中使用方便的索引。Fortran例程如下所示:

subroutine fortran_glue_code(n, array) bind(c)
    use iso_c_binding, only: c_int
    integer(c_int), intent(in) :: n, array(2 * n)
    real(double_precision) :: result

    call do_the_number_crunching(result, reshape(array, [2, n]))
    { do stuff with the result... }
end subroutine

subroutine do_the_number_crunching(result, array)    ! not C-interoperable
    real(double_precision), intent(out) :: result
    integer, intent(in) :: array(:,:)

    if (size(array, 1) /= 2) then
        print *, "Wrong size!"
        call exit(1)
    end if

    { crunch crunch crunch... }
end subroutine

我不满意的是 reshape不必要地创建了一个临时数组,对于我将要使用的数据,这是一个非常大的数组。
所讨论的过程将 array视为只读,因此我认为,编译器可以简单地创建一个新的Fortran数组头,它引用内存中数组内容的相同位置,只是大小不同。是否有任何方法可以避免使用整形来复制数组?

最佳答案

我不明白你的问题,你为什么不

subroutine fortran_glue_code(n, array) bind(c)
    use iso_c_binding, only: c_int
    integer(c_int), intent(in) :: n, array(2, n)
    real(double_precision) :: result

    call do_the_number_crunching(result, array)
    { do stuff with the result... }
end subroutine


或者,也可以使用序列关联
subroutine fortran_glue_code(n, array) bind(c)
    use iso_c_binding, only: c_int
    integer(c_int), intent(in) :: n, array(2 * n)
    real(double_precision) :: result

    call do_the_number_crunching(result, array, n)
    { do stuff with the result... }
end subroutine

subroutine do_the_number_crunching(result, array, n)    ! not C-interoperable
    real(double_precision), intent(out) :: result
    integer, intent(in) :: array(2,n)
    integer, intent(in) :: n

    if (size(array, 1) /= 2) then
        print *, "Wrong size!"
        call exit(1)
    end if

    { crunch crunch crunch... }
end subroutine

但这是一个不必要的复杂问题。