classification
Title: Add support for C99 complex type (_Complex) as ctypes.c_complex
Type: enhancement Stage: test needed
Components: ctypes Versions: Python 3.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Arfrever, Tom Krauss, amaury.forgeotdarc, arigo, mark.dickinson, meador.inge, rkmountainguy, rutsky
Priority: normal Keywords:

Created on 2013-01-08 22:06 by rutsky, last changed 2018-07-04 15:01 by arigo.

Messages (10)
msg179378 - (view) Author: Vladimir Rutsky (rutsky) Date: 2013-01-08 22:06
It would be nice if Python will be able to access variables with C99 complex types through ctypes module.
msg179459 - (view) Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) Date: 2013-01-09 15:48
libffi still has no support for _Complex.

Did you try with a pure Python solution, like the one suggested in http://objectmix.com/python/112374-re-ctypes-c99-complex-numbers.html
msg179609 - (view) Author: Vladimir Rutsky (rutsky) Date: 2013-01-11 00:45
Yes, I managed to pass and operate with matrices of complex numbers to pure C and Fortran programs by using Numpy and their ctype adapters (only for whole matrices, they don't provide c_complex type; in general see http://www.scipy.org/Cookbook/Ctypes for details).

I suppose pure python solution that suggested in provided by you link works too:

class Complex64(Structure):
    _fields_ = [("real", c_float), ("imag", c_float)]

But I'm unsure is this is expected behavior or luck, and on some platform this code will not work due to different complex numbers internal representation.

Any way this should be implemented in libffi first, and then in ctypes, so this feature request should be postponed, IMO.
msg179646 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2013-01-11 08:24
> But I'm unsure is this is expected behavior or luck, and on some
> platform this code will not work due to different complex numbers
> internal representation.

What platform?  Isn't the complex number representation standard?  E.g., C99 6.2.5p13 says: "Each complex type has the same representation and alignment requirements as an array type containing exactly two elements of the corresponding real type; the first element is equal to the real part, and the second element to the imaginary part, of the complex number."
msg180759 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2013-01-27 10:40
Postponing as suggested.
msg285961 - (view) Author: Tom Krauss (Tom Krauss) Date: 2017-01-21 16:37
I'm trying to add support for this in cffi, which uses ctypes... apparently this is now supported in libffi (https://github.com/libffi/libffi, v3.2 Nov 2014). 
It would be nice if this issue could be re-opened, or another one created for the same purpose.
msg285998 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2017-01-22 08:23
Thanks, Tom. Re-opening.
msg286453 - (view) Author: Armin Rigo (arigo) * (Python committer) Date: 2017-01-29 22:23
* Tom: the issue is unrelated to cffi, but both ctypes and cffi could proceed to support C complexes, now that libffi support has been added.

* Mark: the problem is that the text you quote from the C standard fixes the representation of a complex in memory, but doesn't say anything about directly passing a complex as argument or return value to a function call.  Platforms use custom ways to do that.  The text you quote says a complex is an array of two real numbers; but passing an array as argument to a function works by passing a pointer to the first element.  Typically, this is not how complexes are passed: instead, some pointerless form of "passing two real numbers" is used.
msg321046 - (view) Author: Reid (rkmountainguy) Date: 2018-07-04 14:47
I concur with rutsky.  Complex numbers are essential in the physical sciences, and the complex type is part of the c99 standard.  Trying to shoehorn complex support by a user-defined type makes use of the builtin methods for the standard complex type clunky.
msg321049 - (view) Author: Armin Rigo (arigo) * (Python committer) Date: 2018-07-04 15:01
cffi supports complex numbers since release 1.11---for direct calls using the API mode.  That means that neither CFFI's ABI mode, nor ctypes, can possibly work yet.  The problem is still libffi's own support, which is still not implemented (apart on a very uncommon CPU architecture, the s390).
History
Date User Action Args
2018-07-04 15:01:25arigosetmessages: + msg321049
2018-07-04 14:47:28rkmountainguysetnosy: + rkmountainguy

messages: + msg321046
versions: + Python 3.7, - Python 3.4
2017-01-29 22:23:09arigosetnosy: + arigo
messages: + msg286453
2017-01-22 08:23:51mark.dickinsonsetstatus: closed -> open
resolution: postponed ->
messages: + msg285998
2017-01-21 16:37:52Tom Krausssetnosy: + Tom Krauss
messages: + msg285961
2013-01-27 10:40:26mark.dickinsonsetstatus: open -> closed
resolution: postponed
messages: + msg180759
2013-01-15 03:30:24meador.ingesetnosy: + meador.inge
2013-01-13 08:32:53Arfreversetnosy: + Arfrever
2013-01-12 01:47:12terry.reedysetstage: test needed
versions: + Python 3.4
2013-01-11 08:24:56mark.dickinsonsetnosy: + mark.dickinson
messages: + msg179646
2013-01-11 00:45:12rutskysetmessages: + msg179609
2013-01-09 15:48:27amaury.forgeotdarcsetnosy: + amaury.forgeotdarc
messages: + msg179459
2013-01-08 22:06:03rutskycreate