Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pointers and ctypes

2 views
Skip to first unread message

rubbis...@web.de

unread,
Aug 29, 2005, 9:19:17 AM8/29/05
to
Hello,
i've got a problem with pointers in the following function which i want
to use:

I16 __stdcall DO_ReadPort (U16 CardNumber, U16 Port, U32 *Value)

The function is supposed to read out the status of a digital port of
analog digital interface card.
I got this function from Dask.h which came with the card. The relevant
lines concerning this function are the following:

typedef short I16;
typedef unsigned short U16;
typedef unsigned long U32;

I16 __stdcall DO_ReadPort (U16 CardNumber, U16 Port, U32 *Value)

I tried to implement this function into python:
# I16 __stdcall DO_ReadPort (U16 CardNumber, U16 Port, U32 *Value);
ReadOPort = dask.DO_ReadPort
ReadOPort.argtypes = [c_ushort, c_ushort, c_ulong]
ReadOPort.restype = c_short

I can't handle the pointer "Value" which should be an unsigned long
pointer. I'd be very happy, if u could give me a hint how to implement
this pointer into python.

Thanks a lot

Carlo and Pierre

F. Petitjean

unread,
Aug 29, 2005, 10:05:57 AM8/29/05
to

You can use the ctypes.byref() function (as it is in an argulent list):

ReadOPort.argtypes = (c_ushort, c_ushort, ctypes.POINTER(c_ulong) )
ReadOPort.restype = c_short
status = c_ulong() # status value to be read
number = c_ushort(1) # CardNumber = 1
port = c_ushort(11)
rc = ReadOPort(number, port, ctypes.byref(status))
print rc, ststus

rubbis...@web.de

unread,
Aug 29, 2005, 10:22:31 AM8/29/05
to
thanks a bunch, i just got the answer myself. next time i think about
it a little longer.
thanks again
carlo

Mike C. Fletcher

unread,
Aug 29, 2005, 10:33:17 AM8/29/05
to pytho...@python.org
F. Petitjean wrote:

>Le 29 Aug 2005 06:19:17 -0700, rubbis...@web.de a écrit :
>
>

...

>You can use the ctypes.byref() function (as it is in an argulent list):
>
> ReadOPort.argtypes = (c_ushort, c_ushort, ctypes.POINTER(c_ulong) )
> ReadOPort.restype = c_short
> status = c_ulong() # status value to be read
> number = c_ushort(1) # CardNumber = 1
> port = c_ushort(11)
> rc = ReadOPort(number, port, ctypes.byref(status))
> print rc, ststus
>
>

Just as an FYI, Thomas has recently added code which does the byref
automatically. The version of ctypes in CVS HEAD will allow you to pass
in a c_ulong where the argtype is ctypes.POINTER(c_ulong).

Have fun,
Mike

--
________________________________________________
Mike C. Fletcher
Designer, VR Plumber, Coder
http://www.vrplumber.com
http://blog.vrplumber.com

0 new messages