При передаче разделов массивов в подпрограммы в Фортране, например, f(a, b, c(2:5,4:6))
(все из них 2D-массивы), программа сначала создает временную копию c
, а затем передает ее подпрограмме (в качестве ссылки, указателя). , et c), или все это обрабатывается динамически?
Я пытаюсь преобразовать некоторый код на Фортране в C ++, и я вижу вызовы подпрограмм, в которых в качестве аргументов передаются секции массивов. Насколько мне известно, C ++ не позволяет этого, поэтому я попытался обойти это в C ++ следующим образом (mat2d = std::vector<std::vector<T>>
):
f(mat2d &a, mat2d &b, mat2d *a, int rows, int rows, int offsetx, int offsety) {...}
и назвав его:
f(a, b, c.data(), ...)
Это работает но это требует размера (ов), а также смещения для случаев, когда я хочу сделать матричное умножение c (например). Итак, если Фортран сначала делает копию c(2:5,4:6)
в (скажем) массиве temp(4,3)
, то я могу имитировать c, что в C ++: просто сделать копию во временную, а затем передать ссылку на эту временную функция, без строк / столбцов / смещений. Но если нет ... Я не против услышать мысли других людей.
Пример подпрограммы:
subroutine f(A, B, C)
implicit none
real(kind(1d0)) :: A(2,2), B(2,2), C(2,2)
C = A*B
return
end f
Если мои слова плохие, возможно, картинка с реальный код подойдет? Массивы: auxfour(4,4)
, aux44(4,4)
и Gv(2,2)
.
А вот вызов, с auxp(5)
и тем же Gv
:
Полная подпрограмма. Картинка, а не слова.