Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing a C++ complex array to C

Tags:

c++

c

I must pass complex data to a C function from C++. In C++ the data is naturally stored in a std::vector<std::complex> c. The C function expects the data as an array of double, double a[] such that a[0]=Re(c[0]), a[1]=Im(c[0]), a[2]=Re(c[1]), etc.

What is the best safe way to pass such data? Is casting like

(double*) (&c[0])

asking for trouble?

Sorry if this is duplicate, I could only find information on the related problem of passing C++ complex to C99 complex.

like image 953
TomasG Avatar asked Feb 16 '11 17:02

TomasG


1 Answers

The C++0x standard went to lengths to guarantee that such conversions will work (§26.4):

Moreover, if a is an expression of type cv std::complex<T>* and the expression a[i] is well-defined for an integer expression i, then:

reinterpret_cast<cv T*>(a)[2*i] shall designate the real part of a[i], and

reinterpret_cast<cv T*>(a)[2*i + 1] shall designate the imaginary part of a[i].

and (§23.3.6):

The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

The layout of the complex value is not guaranteed by the prevailing C++03 standard (though the vector layout is), but I would be surprised to find an implementation for which it does not hold.

like image 57
Stephen Canon Avatar answered Oct 14 '22 18:10

Stephen Canon