Skip to content
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

f2py fails for functions returning character(len=len(input_string)) #3425

Closed
chatcannon opened this issue Jun 12, 2013 · 6 comments · Fixed by #19388
Closed

f2py fails for functions returning character(len=len(input_string)) #3425

chatcannon opened this issue Jun 12, 2013 · 6 comments · Fixed by #19388

Comments

@chatcannon
Copy link
Contributor

I've written simple toupper() and tolower() functions in Fortran that start like this:

pure function toupper(str)
  character(len=*) intent(in) :: str
  character(len=len(str)) :: toupper
  ...

When wrapping these with f2py, I get an error looking like this:

/tmp/tmpmrZ5Ra/src.linux-x86_64-2.7/RMCfunctionsmodule.c: In function ‘f2py_rout_RMCfunctions_mod_functions_toupper’:
/tmp/tmpmrZ5Ra/src.linux-x86_64-2.7/RMCfunctionsmodule.c:926:23: error: ‘str_Dims’ undeclared (first use in this function)

slen(toupper) = len(str);
                      ^

I guess the len(str) needs to be replaced by slen(str).

This problem occurs with both f2py-2.7 and f2py-3.3
It does not depend on the name of the variable str - I tried a couple of other names.

@chatcannon
Copy link
Contributor Author

Sorry, I couldn't work out how to tag this with component: numpy.f2py

@chatcannon
Copy link
Contributor Author

P.S. I'm running numpy version 1.7.1 on Gentoo GNU/Linux

@charris
Copy link
Member

charris commented Feb 23, 2014

@chatcannon I suspect this problem persists, but could you try with numpy 1.8 or current development?

@pearu pearu added this to To do in f2py core Feb 19, 2021
@pearu pearu moved this from To do to To do: strings in f2py core Feb 19, 2021
@Goutte
Copy link

Goutte commented Apr 7, 2021

I can confirm the issue is still here in numpy 1.20.
Barring a fix (it's been 8 years), any tip on how to bypass this issue would be welcome!

@melissawm
Copy link
Member

Here's what I've managed to get so far:

  1. Wrapping the following:
  pure function test(str)
    character(len=*), intent(in) :: str
    character(len=len(str)) :: test
    integer :: i

    test(1:1) = 'A'
    do i = 2, len(str)
       test(i:i) = str(i:i)
    enddo
    
  end function test

I get:

/tmp/tmpdg8zrhbc/src.linux-x86_64-3.9/stringsmodule.c: In function 'f2py_rout_strings_strings_test':
/tmp/tmpdg8zrhbc/src.linux-x86_64-3.9/stringsmodule.c:279:20: error: 'str_Dims' undeclared (first use in this function)
  279 |   slen(test) = len(str);
      |                    ^~~
  1. I tried using a subroutine, with the following signature file:
python module strings ! in 
    interface  ! in :strings
        module strings ! in :strings:strings.f90
            subroutine test(str, a) ! in :strings:strings.f90:strings
                character*(*) intent(in) :: str
                character*len(str) intent(out) :: a
            end subroutine test
        end module strings
    end interface 
end python module strings

Running $ f2py -c strings.f90 strings.pyf compiles fine, but

>>> import strings
>>> print(strings.strings.test.__doc__)  # should return a as output, but returns
test(str,a)

Wrapper for ``test``.

Parameters
----------
str : input string(len=-1)
a : input string(len=1)

(note the incorrect intent for a)

  1. Changing strings.pyf to use character(len=slen(str)), intent(out) :: a runs fine and works.

So the problem seems to be when using a function but not a subroutine.

When inspecting the code, IIUC the problem comes from the fact that we need to use slen for the C function wrapper, but len for the fortran function wrapper (both generated by f2py).

My question to @pearu is if we should require the use of the slen expression in the pyf file in this case, or try to fix this from f2py itself, considering the two separate cases of the fortran and C function wrappers.

@pearu
Copy link
Contributor

pearu commented May 31, 2021

My first reaction (without looking at code) is that f2py should be fixed by replacing len(..) call with slen(..) when len is used in the context of character len specification. Note that there are three kinds of length functions involved here: slen and len defined by f2py and to be used withing .pyf files, and len that is Fortran intrinsic. f2py len should be used in the context of arrays while f2py slen in the context of character types.

pearu added a commit to pearu/numpy that referenced this issue Jul 3, 2021
@pearu pearu self-assigned this Jul 3, 2021
@pearu pearu linked a pull request Jul 3, 2021 that will close this issue
pearu added a commit to pearu/numpy that referenced this issue Sep 1, 2021
pearu added a commit to pearu/numpy that referenced this issue Sep 6, 2021
TST: added test for issue numpy#18684

ENH: f2py opens files with correct encoding, fixes numpy#635

TST: added test for issue numpy#6308

TST: added test for issue numpy#4519

TST: added test for issue numpy#3425

ENH: Implement user-defined hooks support for post-processing f2py data structure. Implement character BC hook.

ENH: Add support for detecting utf-16 and utf-32 encodings.
melissawm pushed a commit to pearu/numpy that referenced this issue Apr 4, 2022
TST: added test for issue numpy#18684

ENH: f2py opens files with correct encoding, fixes numpy#635

TST: added test for issue numpy#6308

TST: added test for issue numpy#4519

TST: added test for issue numpy#3425

ENH: Implement user-defined hooks support for post-processing f2py data structure. Implement character BC hook.

ENH: Add support for detecting utf-16 and utf-32 encodings.
HaoZeke pushed a commit to pearu/numpy that referenced this issue Jun 5, 2022
TST: added test for issue numpy#18684

ENH: f2py opens files with correct encoding, fixes numpy#635

TST: added test for issue numpy#6308

TST: added test for issue numpy#4519

TST: added test for issue numpy#3425

ENH: Implement user-defined hooks support for post-processing f2py data structure. Implement character BC hook.

ENH: Add support for detecting utf-16 and utf-32 encodings.
f2py core automation moved this from To do: strings to Done Jun 6, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

Successfully merging a pull request may close this issue.

5 participants