On 01/31/2018 02:06 AM, Joe wrote:
Does someone know of a function or a convenient way to automatically
derive a dtype object from a C typedef struct string or a cffi.typeof()?

I remember when I wrote those docs over a year ago, I searched for an established way to do this but didn't find one. If you find/come up with one, let us know and I might add a pointer or description of it in the docs.

Searching just now, I came across this recent gist:

https://gist.github.com/inactivist/4ef7058c2132fa16759d

So it looks like we can do something like:

    # typemap from C type to numpy type may need some work...
    typemap = {'char': 'byte', 'short': 'short', 'int': 'intc',
               'long long': 'longlong', 'size_t': 'intp',
               'float': 'float', 'double': 'double'}

    def extract_field_info(tp):
        fields = []
        for field, fieldtype in tp.fields:
            if fieldtype.type.kind == 'primitive':
                format = typemap[fieldtype.type.cname]
            else:
                format = extract_field_info(fieldtype.type)
            fields.append((field, format, fieldtype.offset))
        return fields

     from cffi import FFI
     ffi = FFI()
     ffi.cdef("struct foo { int a; char b; double d;};")
     tp = ffi.typeof('struct foo')

     names, formats, offsets = zip(*extract_field_info(tp))
     np.dtype({'names': names, 'formats': formats, 'offsets': offsets})
     # compare to: np.dtype('i4,i1,f8', align=True)

I just made that up now and it may be buggy and have missing corner cases. But if you agree it works, maybe we can mention it in the structured array docs instead of the vague sentence there now, that "some work may be needed to obtain correspondence with the C struct".

Allan

Am 27.01.2018 10:30 schrieb Joe:
Thanks for your help on this! This solved my issue.


Am 25.01.2018 um 19:01 schrieb Allan Haldane:
There is a new section discussing alignment in the numpy 1.14 structured
array docs, which has some hints about interfacing with C structs.

These new 1.14 docs are not online yet on scipy.org, but in the meantime
  you can view them here:
https://ahaldane.github.io/user/basics.rec.html#automatic-byte-offsets-and-alignment

(That links specifically to the discussion of alignments and padding).

Allan

On 01/25/2018 11:33 AM, Chris Barker - NOAA Federal wrote:


The numpy dtype constructor takes an “align” keyword that will pad it
for you.

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.dtype.html

-CHB



_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion


_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

Reply via email to