Возможный дубликат:
Передача сложного массива C ++ в C
Если сторонняя библиотека C ожидает массив комплексных чисел C99 в качестве аргумента, как проще всего вызвать ее из C ++, где мои комплексные числа используют комплексный тип STL? Я мог бы просто обернуть это в новую функцию c, которая принимает числа с плавающей точкой и преобразовывает их в сложные, но есть ли более прямой способ сделать это?
Согласно C99:
6.2.5 / 13 Каждый сложный тип имеет те же требования к представлению и выравниванию, что и массив
тип, содержащий ровно два элемента соответствующего реального типа; первый элемент
равна реальной части, а второй элемент мнимой части комплекса
число.
и в соответствии с C ++ 11:
26,4 если
a
это выражение типаcv* std::complex<T>*
и выражениеa[i]
хорошо определено для целочисленного выраженияi
, затем:
reinterpret_cast<cv T*>(a)[2*i]
обозначить реальную часть a[i]
, а такжеreinterpret_cast<cv T*>(a)[2*i + 1]
обозначить мнимую часть a[i]
Вместе это означает, что оба типа имеют одинаковую компоновку, поэтому вы можете просто передать функции C указатель на массив std::complex
,
Обратите внимание, что более старые версии C ++ не гарантировали эту разметку.
Других решений пока нет …