Предоставить сложные аргументы C99 из переполнения стека

Возможный дубликат:
Передача сложного массива C ++ в C

Если сторонняя библиотека C ожидает массив комплексных чисел C99 в качестве аргумента, как проще всего вызвать ее из C ++, где мои комплексные числа используют комплексный тип STL? Я мог бы просто обернуть это в новую функцию c, которая принимает числа с плавающей точкой и преобразовывает их в сложные, но есть ли более прямой способ сделать это?

3

Решение

Согласно 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 ++ не гарантировали эту разметку.

4

Другие решения

Других решений пока нет …