Я передаю некоторые данные, считанные функцией C, в процедуру Fortran, которая будет выполнять всю работу с числами. Массив, естественно, рассматривается как имеющий форму (2, nn)
в Фортране. Поскольку в C нет многомерных массивов, массив выделяется и используется в C с длиной 2 * nn
.
Я хотел бы изменить форму массива на Фортране, чтобы использовать удобную индексацию в числовом коде. Подпрограммы Фортрана будут выглядеть примерно так:
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, который ссылается на то же место в памяти для содержимого массива, только с другими Габаритные размеры. Есть ли способ избежать копирования массива с изменением формы?