2015-08-06 4 views
1

Я переношу некоторый код из Intel Fortran в gfortran, и я не могу понять, как переносить функцию Intel INT_PTR_KIND().ifort -> gfortran: INT_PTR_KIND()

program main 
    integer (INT_PTR_KIND()) v1 
    integer v2 

    print*, "sizeof v1:", sizeof(v1) 
    print*, "sizeof v2:", sizeof(v2) 
    print*, "sizeof INT_PTR_KIND:", INT_PTR_KIND() 
end program main 

дает мне компилятор Intel следующее:

sizeof v1:      8 
sizeof v2:      4 
sizeof INT_PTR_KIND:   8 

Пожалуйста, как можно достичь следующих результатов в gfortran? Я пробовал с добрым (1), sizeof, ... все дает мне 4.

ответ

2

правильное число вид из iso_c_binding модуля для этого c_intptr_t

т.е. самый прямой эквивалент вашего кода:

use, intrinsic :: iso_c_binding 

integer(c_intptr_t) :: v1 

integer(8) может означать что угодно или вообще ничего для некоторых компиляторов.

integer(c_intptr_t) непосредственно взаимодействует с intptr_t от C (size_t vs. uintptr_t).

+0

Проблема в том, что на моем 64arch c_intptr_t возвращает 4 и INT_PTR_KIND() 8 – miro

+0

Вы уверены, что работаете в 64-битном режиме? Они должны показывать то же самое, иначе это очень серьезная ошибка. КАК ТОЧНО вы спрашиваете? –

+0

@fjordrunner Если вы делаете 'sizeof (c_intptr_t)', то вы делаете это неправильно. Вы должны сделать 'sizeof (1_c_intptr_t)' –

2

Вам нужно посмотреть информацию о совместимости, use iso_c_binding, там есть специальный тип для указателей C, что возможно, что вы ищем.

program test 
    use iso_c_binding 
    implicit none 

    type(c_ptr) :: adr 
    integer(8) :: int8 
    integer :: int_default 

    print*, sizeof(adr) 
    print*, sizeof(int8) 
    print*, sizeof(int_default) 

end program test 

следует за this link для получения дополнительной информации.

+0

На моем 64arch выход 8,8,4. Я предполагаю, что по 32-го результата результат будет 4,8,4? Верный? – miro

+0

Думаю, что да. Для большинства 32arch это будет 4, 8 4, как вы предложили. Но в общем случае 32arch у меня нет уверенности, так как некоторые 32-битные системы внедрили какой-то трюк, чтобы поддерживать более 32-битный адрес, я не знаю, будет ли он удерживаться для этих систем. – innoSPG