Juan,
If I replace I32 with 4 and R64 with 8 in sub0 your code works OK for me.
This is with gfortran 4.3.3, python 2.5.2 and numpy v 1.4.0
--George.
2010/1/18 Juan <fiolj@yahoo.com>:
> Hi, thanks for the advice. I did not notice that the integer division could be a
> source for trouble. Now I changed all the routines. However, I still have the
> same segmentation fault.
>>> debug-capi:Python C/API function
> mymod.sub0(state,ndim=shape(state,0),ntrajectories=shape(state,1))
> debug-capi:double
> state=:inoutput,required,array,dims(ndim|ndim,ntrajectories|ntrajectories)
> debug-capi:int ndim=shape(state,0):input,optional,scalar
> debug-capi:ndim=24
> debug-capi:Checking `shape(state,0)==ndim'
> debug-capi:int ntrajectories=shape(state,1):input,optional,scalar
> debug-capi:ntrajectories=100
> debug-capi:Checking `shape(state,1)==ntrajectories'
> debug-capi:Fortran subroutine `sub0(state,&ndim,&ntrajectories)'
> debug-capi:ndim=24
> debug-capi:ntrajectories=100
> debug-capi:Building return value.
> debug-capi:Python C/API function mymod.sub0: successful.
> debug-capi:Freeing memory.
> debug-capi:Python C/API function
> mymod.sub1(state,d_i,d_f,ndim=shape(state,0),ntrajectories=shape(state,1))
> debug-capi:double
> state=:inoutput,required,array,dims(ndim|ndim,ntrajectories|ntrajectories)
> Segmentation fault
>> The working sub1 has two other arguments d_i and d_f which are real scalars, the
> full signatures are:
>> subroutine sub0(state, Ndim, Ntrajectories)
> integer(I32), intent(IN) :: Ndim
> integer(I32), intent(IN) :: Ntrajectories
> real(R64), intent(INOUT), dimension(Ndim,Ntrajectories) :: state
> ...
> end subroutine sub0
>> subroutine sub1(state,d_i,d_f, Ndim,Ntrajectories)
> integer(4), intent(IN) :: Ndim
> integer(4), intent(IN) :: Ntrajectories
> real(8), intent(INOUT), dimension(Ndim, Ntrajectories) :: state
> real(8), intent(IN) :: d_i
> real(8), intent(IN) :: d_f
> print *, shape(state), Ndim, Ntrajectories
> ...
> end subroutine sub1
>> and I am calling from my script as:
>> import mymod
> Ndim=24
> Ntrajectories=10
> di=0., df=10.
> r= np.zeros((Ndim,Ntrajectories),dtype=np.float64, order='Fortran')
>> mymod.sub0(r)
> mymod.sub1(r, di, df)
>> As it can be seen from the debug output, f2py is checking the arguments for sub0
> but it segfault before checking the args in sub1 (with no very informative
> messages).
>> It may well be a problem related to theworkings of the routines but they work
> when I use them in tests on pure fortran code. Additionally I get a very similar
> error message if I call sub0 (mymod.sub0(r)) instead of sub1 (mymod.sub1(r, di,
> df)) the second time in the python script.
>> Any ideas? Thanks again. Juan
>>> -------- Original Message --------
> Subject: f2py segfault
> Date: Sun, 17 Jan 2010 15:28:23 -0300
> From: Juan <fiolj@yahoo.com>
> To: scipy-user@scipy.org>> Hi, I don't know if this is the right place (if it is not, please point me in
> the right direction).
> I am using f2py with some own programs and I am going insane with a segmentation
> fault. It is probably a problem in my code but I'd like to know if someone has
> any hint
> to give me since I've been trying different things for two days already.
>> I've got a few routines in fortran with in/out arrays. When I call one of the
> routines it works well. The second routine I call crashes the program. I've been
> changing routines and it seems that it does not matter with routines I use.
>> Basically, the fortran routines have the signature:
>> _______________________________________________
> SciPy-User mailing list
>SciPy-User@scipy.org>http://mail.scipy.org/mailman/listinfo/scipy-user>