A
alex
Hello everybody
I am mainly a Fortran programmer and beginning to learn Python(2.5)
and OOP programming.
I hope in the end to put a GUI on my existing Fortran code.
Therefore I am also trying to learn Python's "ctypes" library.
Unfortunately the ctypes tutorial does not show simple examples so I
set up a simple fortran module
and Python script to test.
But even with passing Integer and Real values I get the right output
but with subsequent error:
ValueError: Procedure probably called with too many arguments (4 bytes
in excess)
The scripts exits then, so the second subroutine call does not happen.
From reading comp.lang.python and comp.lang.fortran I understood that
passing character strings
may not be simple but I could not find any solution to my problem.
Maybe somebody can help me with solving it?
The Fortran module (footst.f90):
!
module footst
!
implicit none
!
!
!- End of module header
------------------------------------------------
!
!- Execution part of the module
----------------------------------------
!
!
contains
!- Define procedures contained in this module.
!
!-----------------------------------------------------------------------
!
!
subroutine foo1(int_tst)
!DEC$ ATTRIBUTES DLLEXPORT :: foo1
integer, intent(in):: int_tst
write(unit=*, fmt="(a)") "Subroutine foo1(int_tst)"
write(unit=*, fmt="(a, i4)") "a= ", int_tst
end subroutine foo1
!
!
subroutine foo2(real_tst)
!DEC$ ATTRIBUTES DLLEXPORT :: foo2
real, intent(in):: real_tst
write(unit=*, fmt="(a)") "Subroutine foo2(real_tst)"
write(unit=*, fmt="(a, f6.2)") "a= ", real_tst
end subroutine foo2
!
!
end module footst
!
The Python script (footst.py):
#!/usr/bin/env python
#
#
from ctypes import *
#
#
if __name__ == '__main__':
tst=windll.LoadLibrary("f:\\scratch\\test2\\footst.dll")
# tst.restype=None
# tst.argtypes=(c_int)
x=c_int(999)
y=c_float(10.5)
tst.footst_mp_foo1_(byref(x))
# Passing Real values commented out, but leads to the same error
# tst.footst_mp_foo2_(byref(y))
#
main()
#
#
The DOS prompt output:
F:\Scratch\Test2>df /dll /iface=(cref,nomixed_str_len_arg)/
names:lowercase /assume:underscore footst.f90
Compaq Visual Fortran Optimizing Compiler Version 6.6 (Update B)
Copyright 2001 Compaq Computer Corp. All rights reserved.
footst.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/entry:_DllMainCRTStartup@12
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
F:\SysTemp\obj5B.tmp
dfordll.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:footst.dll
/dll
Creating library footst.lib and object footst.exp
F:\Scratch\Test2>dumpbin /exports footst.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file footst.dll
File Type: DLL
Section contains the following exports for footst.dll
0 characteristics
497F5CC3 time date stamp Tue Jan 27 20:13:07 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 00001000 footst_mp_foo1_
2 1 000010A6 footst_mp_foo2_
Summary
1000 .data
1000 .rdata
1000 .reloc
1000 .text
F:\Scratch\Test2>footst.py
Subroutine foo1(int_tst)
a= 999
Traceback (most recent call last):
File "F:\Scratch\Test2\footst.py", line 13, in <module>
tst.footst_mp_foo1_(byref(x))
ValueError: Procedure probably called with too many arguments (4 bytes
in excess)
F:\Scratch\Test2>
I am mainly a Fortran programmer and beginning to learn Python(2.5)
and OOP programming.
I hope in the end to put a GUI on my existing Fortran code.
Therefore I am also trying to learn Python's "ctypes" library.
Unfortunately the ctypes tutorial does not show simple examples so I
set up a simple fortran module
and Python script to test.
But even with passing Integer and Real values I get the right output
but with subsequent error:
ValueError: Procedure probably called with too many arguments (4 bytes
in excess)
The scripts exits then, so the second subroutine call does not happen.
From reading comp.lang.python and comp.lang.fortran I understood that
passing character strings
may not be simple but I could not find any solution to my problem.
Maybe somebody can help me with solving it?
The Fortran module (footst.f90):
!
module footst
!
implicit none
!
!
!- End of module header
------------------------------------------------
!
!- Execution part of the module
----------------------------------------
!
!
contains
!- Define procedures contained in this module.
!
!-----------------------------------------------------------------------
!
!
subroutine foo1(int_tst)
!DEC$ ATTRIBUTES DLLEXPORT :: foo1
integer, intent(in):: int_tst
write(unit=*, fmt="(a)") "Subroutine foo1(int_tst)"
write(unit=*, fmt="(a, i4)") "a= ", int_tst
end subroutine foo1
!
!
subroutine foo2(real_tst)
!DEC$ ATTRIBUTES DLLEXPORT :: foo2
real, intent(in):: real_tst
write(unit=*, fmt="(a)") "Subroutine foo2(real_tst)"
write(unit=*, fmt="(a, f6.2)") "a= ", real_tst
end subroutine foo2
!
!
end module footst
!
The Python script (footst.py):
#!/usr/bin/env python
#
#
from ctypes import *
#
#
if __name__ == '__main__':
tst=windll.LoadLibrary("f:\\scratch\\test2\\footst.dll")
# tst.restype=None
# tst.argtypes=(c_int)
x=c_int(999)
y=c_float(10.5)
tst.footst_mp_foo1_(byref(x))
# Passing Real values commented out, but leads to the same error
# tst.footst_mp_foo2_(byref(y))
#
main()
#
#
The DOS prompt output:
F:\Scratch\Test2>df /dll /iface=(cref,nomixed_str_len_arg)/
names:lowercase /assume:underscore footst.f90
Compaq Visual Fortran Optimizing Compiler Version 6.6 (Update B)
Copyright 2001 Compaq Computer Corp. All rights reserved.
footst.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/entry:_DllMainCRTStartup@12
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
F:\SysTemp\obj5B.tmp
dfordll.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:footst.dll
/dll
Creating library footst.lib and object footst.exp
F:\Scratch\Test2>dumpbin /exports footst.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file footst.dll
File Type: DLL
Section contains the following exports for footst.dll
0 characteristics
497F5CC3 time date stamp Tue Jan 27 20:13:07 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 00001000 footst_mp_foo1_
2 1 000010A6 footst_mp_foo2_
Summary
1000 .data
1000 .rdata
1000 .reloc
1000 .text
F:\Scratch\Test2>footst.py
Subroutine foo1(int_tst)
a= 999
Traceback (most recent call last):
File "F:\Scratch\Test2\footst.py", line 13, in <module>
tst.footst_mp_foo1_(byref(x))
ValueError: Procedure probably called with too many arguments (4 bytes
in excess)
F:\Scratch\Test2>