Нет , не с текущей компоновкой вашего массива, по двум причинам:
- Fortran использует порядок элементов массива, в котором непрерывное крайнее левое измерение. То есть в массиве размером
(n,m,l)
расстояние между элементами (шаг 1008 *) составляет (1,n,m)
, измеренное в единицах элементов массива (т. Е. Не в байтах). - F77 не включает в себя массивы предполагаемой формы
a(:)
, которые обычно реализуются путем передачи небольшой структуры дескриптора, которая передает детали, такие как шаг или количество элементов. Вместо этого вы можете использовать только массивы предположительной длины a(*)
, которые обычно являются указателями на первый элемент, вроде C массивов. Вы должны передать длину в качестве отдельного аргумента, а элементы массива должны быть смежными
По этой причине вы можете"передать подмассив «к подпрограмме F77, если этот подмассив является, например, столбцом матрицы: элементы в нем являются смежными.
Возможное решение (которое реализуют многие современные компиляторы Фортрана) заключается в том, что при попытке передать не Непрерывный подмассив функции, которая, как известно, не принимает их, создает копию массива и даже записывает ее обратно в память, если это необходимо. Это было бы эквивалентно:
! Actual array
integer m(3,5)
integer dummy(5)
dummy = m(2,:)
call myF77sub(dummy, 5)
m(2,:) = dummy
Однако, как говорят другие, вы должны стараться не вызывать функции F77 напрямую, а либо адаптировать их или, по крайней мере, обернуть их в более поздние интерфейсы Fortran. Затем вы можете иметь код, подобный приведенному выше, в оболочке и вызывать эту оболочку «как обычно» из современных подпрограмм Фортрана. Тогда вы можете в конечном итоге переписать реальную реализацию на современном Фортране, не затрагивая клиентский код.