Many hours later I found a working solutions in ctypes:
The below makes sense to me but I am still at a loss why the first solution
did not work.
Anybody willing to explain for my better understanding?
Regards,
Alex van der Spek
++++++++++++++++++++++++++++++++++++++++++++
_snns =
ctypes.windll.LoadLibrary(r'C:\MSDEV\Projects\Cyctrac\Debug\Cyctrac.dll')
_cosm = getattr(_snns, '_bnd2prb@12')
_cosm.restype = ctypes.c_int
def snns(indata, outdat):
"""Calls the neural net, returns a vector of 4.
"""
global _cosm
init = ctypes.c_long(0)
odat = (ctypes.c_float * len(outdat))(*outdat)
idat = (ctypes.c_float * len(indata))(*indata)
iok = _cosm(ctypes.byref(idat), ctypes.byref(odat), init)
for i, x in enumerate(odat):
outdat[i] = x
if not iok:
return odat
else:
return False
indata = [0.5 for x in range(31)]
outdat = [0.0 for x in range(4)]
ok = snns(indata, outdat)
if ok:
print indata
print outdat
+++++++++++++++++++++++++++++++++++++++
"Alex van der Spek" <zd...@xs4all.nl> wrote in message
news:5353bf06$0$2830$e4fe5...@news2.news.xs4all.nl...
I have a C code function like this:
++++++++++++++++++++++++++
int __declspec(dllexport) __stdcall bnd2prb(float *in, float *out, int
init)
{enum {OK, Error, Not_Valid};
...
return(OK):
}
++++++++++++++++++++++++++
And in Python I am trying to call this C function:
++++++++++++++++++++++++++
import ctypes
import struct
import array
_snns =
ctypes.windll.LoadLibrary(r'C:\MSDEV\Projects\Cyctrac\Debug\Cyctrac.dll')
_cosm = getattr(_snns, '_bnd2prb@12')
_cosm.argtypes = (ctypes.POINTER(ctypes.c_float),
ctypes.POINTER(ctypes.c_float),
ctypes.c_long)
_cosm.restype = ctypes.c_float
def snns(indata, outdat):
"""Calls the neural net, returns a vector of 4.
"""
global _cosm
init = ctypes.c_long(0)
ilen = len(indata)
olen = len(outdat)
itype = ctypes.c_float * ilen
otype = ctypes.c_float * olen
iok = _cosm(itype(*indata), ctypes.pointer(otype(*outdat)), init)
if not iok:
return True
else:
return False
indata = [0.5 for x in range(31)]
outdat = [0.0 for x in range(4)]
indata[1]=3.14
ok = snns(indata, outdat)
if ok:
print indata
print outdat
+++++++++++++++++++++++++++++++
This executes but leaves the outdat array unchanged.
Obviously I haven't understood ctypes well enough.
Returning arrays from FORTRAN I routinely do through a string_buffer.
That works very well but did not work here at all.
Any and all help welcome.
Alex van der Spek
--
https://mail.python.org/mailman/listinfo/python-list