1

Я работаю над проектом, который требует хранения адреса памяти атрибута производного типа в 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. Может существовать дескриптор функции или опции для компилятора.

+0

Как вы называете этот код C, если вы используете 'use iso_c_binding'? Меня беспокоит то, что что-то в интерфейсе с кодом C является источником различий. – patrickvacek

ответ

1

Вы рассчитываете на поведение, зависящее от процессора. Процессор может проходить путем копирования (и/или выхода), если он является прибыльным. Вы можете использовать указатели-заглушки для передачи указателя.

У вас нет TARGET в вашем коде и вы все еще хотите полагаться на указатели на переменные.

+0

Это интересно! Не могли бы вы рассказать об этом? (Или укажите ссылку/книгу, где я мог бы прочитать об этом?) –

+0

Для конкретных соглашений gfortran см. Http://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html –

+0

В противном случае я рекомендую стандарт Fortran 2008 и информативные приложения. Для этого случая раздел C.9.4 имеет значение (относительно удобства использования указателей на фиктивные аргументы и атрибута «target»). –