Devolver una cadena de texto de fortran subrutina a python usando f2py
(1)
El problema aquí es con la declaración del carácter len=*
. le está diciendo al compilador de Fortran que acepte cualquier cadena de longitud que se ingresó. Eso es genial, excepto cuando lo envuelve con f2py
y tiene la intención de out
, f2py necesita adivinar qué longitud de cadena asignar y pasar a su función y no tiene forma de hacerlo. (Después de todo, ¿qué longitud de cadena debería asumir?).
Me parece que f2py supone una cadena de longitud 0. Cuando asigna una cadena más grande a una cadena más pequeña en fortran, el resultado se trunca (aunque tendría que volver atrás y leer el estándar para averiguar si eso podría provocar errores de memoria). En cualquier caso, parece que eso es lo que está haciendo el compilador gnu.
Si lo cambia a len=3
, funciona.
Alternativamente, hacer algo como esto puede hacer que esto funcione para f2py sin modificar el código original (a excepción de algunos comentarios):
!f2py character(len=256),intent(out):: chid
character(len=*),intent(out):: chid ! char. identifier
Tengo este sencillo módulo en Fortran:
test.f90 :
module test
implicit none
contains
subroutine foo(chid)
implicit none
character(len=*),intent(out):: chid ! char. identifier
chid = "foo"
end subroutine foo
end module test
program bar
use test
character(len=20) text
call foo(text)
write(*,*) text
end program bar
compilándolo (en Windows) gfortran test.f90 -o test.exe
y ejecutándolo da, como se esperaba:
foo
También puedo compilarlo usando f2py: c:/Python27/python.exe c:/Python27/Scripts/f2py.py --fcompiler=gnu95 --compiler=mingw32 -c -m test /test.f90
Cuando ejecuto este script de Python:
test.py :
from id_map import test
print "This should be ''foo'':"
print test.foo()
print "was it?"
Obtengo el siguiente resultado:
This should be ''foo'':
was it?
Como puede ver, la cadena que debería ser "foo" está vacía. ¿Por qué es esto?