Есть ли разница между c_associated () и associated () для проверки ассоциации? - PullRequest
1 голос
/ 01 августа 2020

В следующем коде я пытаюсь проверить статус ассоциации указателя C (1), используя c_associated() непосредственно для указателя C, или (2) используя associated() для указателя Fortran полученный из c_f_pointer().

module test_m
    use iso_c_binding
    implicit none

contains

subroutine sub( cp )
    type(c_ptr) :: cp
    integer, pointer :: fp

    print *, "cp ? ", c_associated( cp )   !! Line 1

    call c_f_pointer( cp, fp )

    print *, "fp ? ", associated( fp )   !! Line 2
end subroutine

end module

program main
    use test_m
    implicit none
    type(c_ptr) :: cp
    integer, target :: x

    ! cp = c_loc( x )   !! => T T
    cp = c_null_ptr   !! => F F

    call sub( cp )
end

В приведенном выше случае результат всегда кажется одинаковым между строками 1 и 2. Но если cp может быть нулевым указателем, следует ли мне использовать c_associated() сначала проверить статус cp, а затем использовать c_f_pointer() только в том случае, если cp гарантированно связан (т.е. не равен нулю)?

1 Ответ

2 голосов
/ 02 августа 2020

c_f_pointer связывает указатель (Fortran) с целью указателя C. Это необходимо, чтобы указатель C на имел цель.

Да, вы должны проверить статус связи указателя C, если есть вероятность, что он не связан.

...