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:_dllmaincrtstar...@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> -- http://mail.python.org/mailman/listinfo/python-list