How to use C enum in Python CTypes?

R

rozniy

I am using Python's CTypes module to import functions from a DLL into
Python. Some of the DLL's functions take enum type arguments, eg:

olDaGetDASS (HDEV hDev, OLSS OlSs, UINT uiElement, PHDASS phDass);

//(this function is in C form)
From the header file, I found that type OLSS is an enum, like this:


typedef enum olss_tag
{
OLSS_AD,
OLSS_DA,
OLSS_DIN,
OLSS_DOUT,
OLSS_SRL,
OLSS_CT
}
OLSS;

I managed to fudge the HDEV, UINT and PHDASS types as CTypes c_long(),
but I am not sure how translate a C enum into Python...

This site
http://python.net/crew/theller/ctypes/tutorial.html#bugs-todo-and-non-implemented-things

says that enumeration types is not implemented,
"Enumeration types are not implemented. You can do it easily yourself,
using c_int as the base class."

How do I do this? I am fairly new to Python, coming in from C++ (of
which I am utterly sick!)
 
M

Marc 'BlackJack' Rintsch

typedef enum olss_tag
{
OLSS_AD,
OLSS_DA,
OLSS_DIN,
OLSS_DOUT,
OLSS_SRL,
OLSS_CT
}
OLSS;

I managed to fudge the HDEV, UINT and PHDASS types as CTypes c_long(),
but I am not sure how translate a C enum into Python...

This site
http://python.net/crew/theller/ctypes/tutorial.html#bugs-todo-and-non-implemented-things

says that enumeration types is not implemented,
"Enumeration types are not implemented. You can do it easily yourself,
using c_int as the base class."

I would just define constants:

(OLSS_AD,
OLSS_DA,
OLSS_DIN,
OLSS_DOUT,
OLSS_SRL,
OLSS_CT) = map(ctypes.c_int, xrange(6))

Ciao,
Marc 'BlackJack' Rintsch
 
R

rozniy

I would just define constants:

(OLSS_AD,
OLSS_DA,
OLSS_DIN,
OLSS_DOUT,
OLSS_SRL,
OLSS_CT) = map(ctypes.c_int, xrange(6))

Ciao,
Marc 'BlackJack' Rintsch- Hide quoted text -

- Show quoted text -


Wouldn't that assign integer values 0 to 5 to the things? I don't know
if it'll give me the correct results.
 
M

Marc 'BlackJack' Rintsch

Wouldn't that assign integer values 0 to 5 to the things?
Yes.

I don't know if it'll give me the correct results.

It should. Enumerations in C are more or less just integer constants.

Ciao,
Marc 'BlackJack' Rintsch
 
J

Jim Langston

rozniy said:
Wouldn't that assign integer values 0 to 5 to the things? I don't know
if it'll give me the correct results.

Yes, that's how C's and C++'s enums work, unless an override is given (which
I know you can do in C++ for sure). Otherwise, they are just numbers
starting at 0. The size of the intergers (byte, 2 bytes, 4 bytes, etc..) is
implemenation defined I believe, but an int normally works.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top