By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,818 Members | 1,223 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,818 IT Pros & Developers. It's quick & easy.

How to use C enum in Python CTypes?

P: n/a
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
Share this Question
Share on Google+
4 Replies


P: n/a
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

P: n/a
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

P: n/a
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

P: n/a
"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.