Я работаю над проектом, который требует хранения адреса памяти атрибута производного типа в Fortran. Что найдено в gfortran, есть неявная копия возврата функции, если return является производным типом. Таким образом, адрес, который я сохранил, не имеет смысла. Существует кусок кода:gfortran и ifort по-разному поведение по функции возвращаемые производные типы
module atest
! use iso_c_binding
type test
real(8):: a
real(8):: p
end type test
interface
subroutine pointerprint(a)
real(8), intent(in) :: a
end subroutine pointerprint
end interface
interface assignment(=)
module procedure overloadedAsgn
end interface
contains
function returnvalue(t)
type(test), intent(in)::t
type(test):: returnvalue
returnvalue%a=t%a+1
call pointerprint(returnvalue%a)
end function returnvalue
SUBROUTINE overloadedAsgn(ret,rhs)
type(test), intent(inout) :: ret
type(test), intent(in) :: rhs
print *, "assign_d"
ret%a=rhs%a
ret%p=rhs%p+1.0d0
call pointerprint(rhs%a)
end SUBROUTINE overloadedAsgn
end module
program xxx
use atest
type(test):: t
type(test):: b
t%a=1.0d0/11.0d0
t%p=0.0d0
b=returnvalue(t)
end program
#include<stdio.h>
void pointerprint_(double *x){
printf("Addr<%lx>\n",(unsigned long)x);
}
Выходной сигнал с помощью gfortran является:
Addr<7fff51df24e0>
assign_d
Addr<7fff51df2520>
outpus использованием ifort является:
Addr<7fffc92e6fc0>
assign_d
Addr<7fffc92e6fc0>
Есть ли способ избежать такой копии в gfortran, чтобы результат был последовательным? Я просто начинаю учиться fortran. Может существовать дескриптор функции или опции для компилятора.
Как вы называете этот код C, если вы используете 'use iso_c_binding'? Меня беспокоит то, что что-то в интерфейсе с кодом C является источником различий. – patrickvacek