Re: feature request for setting _pack_ to a higher value
Axel Seibert <axel <at> globonaut.org>
2010-04-14 20:01:10 GMT
Hi, Thomas!
Thanx for your suggestion. I took your code and changed my union definition. I believe your code has an issue
if size happens to be the same as value (8 in our example), because then modulo operation in the line delta = 8
- size % 8 yields 0, and then delta is set to 8, while it actually should be 0. Right?
So, the original fill_union raises the following exception:
Assert sizeof(N13ARValueStruct3DOT_1E) == 8, sizeof(N13ARValueStruct3DOT_1E
AssertionError: 16
After changing the logic to return the fields unchanged in case size == value, I get another exception:
assert alignment(N13ARValueStruct3DOT_1E) == 8, alignment(N13ARValueStruct3DOT_1E)
AssertionError: 4
So, while the size is now calculated ok, the alignment still is not ok.
Any thoughts?
Thanx,
Axel
Am 13.04.2010 um 22:01 schrieb Thomas Heller:
> Axel Seibert schrieb:
>> Hi, Thomas!
>>
>> Thanx for asking -- no, I have not found any other solution yet.
>
> Ok, so the remaining question was: How can I change a (generated) ctypes Union
> definition so that the packing is a multiple of an arbitrary value, 8 in this case.
>
> Background: A Union contains all the _fields_ in the same memory block (they overlay
> each other; only one is normally valid), so the Union size is the size of the largest
> field. We have now the goal to bring the union size up to a multiple of 8 by adding
> a dummy field. Here is the ode that I wrote:
>
> <snip>
> from ctypes import *
>
> def fill_union(value, fields):
> size = 0
> for name, typ in fields:
> size = max(size, sizeof(typ))
> delta = 8 - size % 8
> return fields + [("", c_char * (size + delta))]
>
> class X(Union):
> _fields_ = fill_union(8, [("a", c_char),
> ("b", c_short),
> ("c", c_char * 31)])
>
> print sizeof(X)
> <snip/>
>
>> So long,
>> Axel
>>
>> Am 09.04.2010 um 10:02 schrieb Thomas Heller:
>>
>>> Axel Seibert schrieb:
>>>> Hi, Thomas!
>>>>
>>>> I tried to apply your solution to my problem. I found two issues with that:
>>>> a) a couple of my structs that require padding are Unions. Do you have a solution for that?
>>>> b) I believe that line "missing = a - size % a" needs to be replaced by missing = a - sizeof(t) % a
>>>
>>> Axel - sorry for this delayed reply; I'm very short on time. Is the question
>>> still open or did you find a solution yourself in the meantime?
>>>
>>> --
>>> Thanks,
>>> Thomas
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Download Intel® Parallel Studio Eval
>>> Try the new software tools for yourself. Speed compiling, find bugs
>>> proactively, and fine-tune applications for parallel performance.
>>> See why Intel Parallel Studio got high marks during beta.
>>> http://p.sf.net/sfu/intel-sw-dev
>>> _______________________________________________
>>> ctypes-users mailing list
>>> ctypes-users <at> lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/ctypes-users
>>>
>>
>>
>> ------------------------------------------------------------------------------
>> Download Intel® Parallel Studio Eval
>> Try the new software tools for yourself. Speed compiling, find bugs
>> proactively, and fine-tune applications for parallel performance.
>> See why Intel Parallel Studio got high marks during beta.
>> http://p.sf.net/sfu/intel-sw-dev
>
>
> --
> Thanks,
> Thomas
>
>
> ------------------------------------------------------------------------------
> Download Intel® Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
> _______________________________________________
> ctypes-users mailing list
> ctypes-users <at> lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ctypes-users
>
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev