472,146 Members | 1,261 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,146 software developers and data experts.

How to use C enum in Python CTypes?

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/ctype...emented-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!)

Aug 7 '07 #1
4 17430
On Tue, 07 Aug 2007 04:57:19 +0000, rozniy wrote:
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/ctype...emented-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
Aug 7 '07 #2
On Aug 7, 2:11 pm, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
On Tue, 07 Aug 2007 04:57:19 +0000, rozniy wrote:
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/ctype...s-todo-and-non...
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- 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.

Aug 7 '07 #3
On Tue, 07 Aug 2007 02:13:38 -0700, rozniy wrote:
On Aug 7, 2:11 pm, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
>On Tue, 07 Aug 2007 04:57:19 +0000, rozniy wrote:
This site
http://python.net/crew/theller/ctype...s-todo-and-non...
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))

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
Aug 7 '07 #4
"rozniy" <ro****@gmail.comwrote in message
news:11**********************@e9g2000prf.googlegro ups.com...
On Aug 7, 2:11 pm, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
>On Tue, 07 Aug 2007 04:57:19 +0000, rozniy wrote:
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/ctype...s-todo-and-non...
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- 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.
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.
Aug 7 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Srijit Kumar Bhadra | last post: by
18 posts views Thread by Paul Watson | last post: by
1 post views Thread by Gerald Klix | last post: by
12 posts views Thread by p.lavarre | last post: by
reply views Thread by Saiars | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.