Thanks to visit codestin.com
Credit goes to github.com

Skip to content

BUG,MAINT: f2py doesn't map iso_c_binding values by default #24553

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
HaoZeke opened this issue Aug 26, 2023 · 0 comments · Fixed by #24555
Closed

BUG,MAINT: f2py doesn't map iso_c_binding values by default #24553

HaoZeke opened this issue Aug 26, 2023 · 0 comments · Fixed by #24555

Comments

@HaoZeke
Copy link
Member

HaoZeke commented Aug 26, 2023

Reproducer

Consider:

! isoc_oddity.f90
  module coddity
    use iso_c_binding, only: c_double
    implicit none
    contains
      subroutine c_add(a, b, c) bind(c, name="c_add")
        real(c_double), intent(in) :: a, b
        real(c_double), intent(out) :: c
        print*, "a is", a
        print*, "b is", b
        c = a + b
      end subroutine c_add
  end module coddity

Which compiles fine but doesn't do what one might expect:

python -m numpy.f2py -c isoc_oddity.f90 -m buggy
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
 a is   2.0000004731118679     
 b is   5.3049894774131808E-315
res: 1.0, exp: 3, eq: False

Clearly, c_double is not being interpreted correctly. This has an easy user-land fix though, adding an .f2py_f2cmap file to the directory (or passing a named file in via the command line) with the following:

# isoc_f2cmap
dict(
    real=dict(c_double="double"),
)

Will work correctly:

python -m numpy.f2py -c isoc_oddity.f90 -m buggy --f2cmap isoc_f2cmap
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
 a is   1.0000000000000000     
 b is   2.0000000000000000     
res: 3.0, exp: 3, eq: True

Suggestion

This is definitely unexpected behavior, iso_c_binding values should be mapped correctly by default, or atleast loaded in when the iso_c_binding module is used.

@HaoZeke HaoZeke changed the title BUG,MAINT: f2py doesn't map iso_c_environment variables by default BUG,MAINT: f2py doesn't map iso_c_binding values by default Aug 26, 2023
HaoZeke added a commit to HaoZeke/numpy that referenced this issue Aug 26, 2023
charris pushed a commit to charris/numpy that referenced this issue Sep 2, 2023
charris pushed a commit to charris/numpy that referenced this issue Nov 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant