1

В Fortran 2003 распределяемый массив равен , а не, совместимый с C. Я полагаю, что это имеет какое-то отношение к дополнительной информации о массиве, хранящейся в памяти, которая может нарушить интерпретацию C.В Fortran2003, 1D Предполагаемая матрица форм, совместимая с C?

Но что, если я объявляю фиктивный аргумент как 1D предполагаемый массив формы? например

subroutine outter_subroutine(ma, size_ma) 
integer :: size_ma 
integer :: ma(size_ma) 

call fortran_subroutine(ma) 

end subroutine 

!----------------------------- 

subroutine fortran_subroutine(a) 
integer, intent(in) :: a(:) 
integer,(kind=c_int):: ierr 
... 
ierr = some_c_function(a) 
... 
end subroutine 

Интерфейс в фортраном может понравиться

interface 
function some_c_function(a) 
integer(c_int) :: a(*) 
end interface 

в то время как C, прототип может быть

int some_c_function(int *a) 

Будет ли это соответствовать стандарту Fortran 2003?

ответ

2

C совместимые подпрограммы не могут принимать аргументы формы, но вы можете передать предполагаемый массив формы (или любой другой) в интероперабельную подпрограмму с аргументом предполагаемого размера (a (*)). Компилятор может создать временный массив, чтобы иметь возможность сделать это, если массив не соприкасается.

+0

Итак, это означает, что если я объявляю фиктивный аргумент с ** предполагаемым размером ** в интерфейсе bind (c), я могу передать в него все виды массива 1D, а компилятор позаботится об остальном? – Francium

+0

Да, это правда. Но иногда нужно сделать временное. –