типы комплексных чисел при смешивании C (99) и C ++ - PullRequest
2 голосов
/ 26 июля 2010

Я пишу математическую библиотеку, ядро ​​которой находится на C ++.Позже это может быть реализовано в чистом C (я полагаю, C99).Я думаю, что мне нужен C-подобный API, чтобы я мог получить Python, Matlab и тому подобное для использования библиотеки.У меня сложилось впечатление, что делать это с C ++ болезненно.

Так есть ли хороший, стандартный или правильный способ приведения между double complex *some_array_in_C99 и complex<double> *some_array_in_cpp?

Я мог бы просто использовать void * указателей, но я не уверен, что это хорошо.

Это может быть придирчиво, потому что кажется, что ctypes прекрасно работает с complex<double>, но я беспокоюсь о matlab и других возможных числовых средах.1011 *

1 Ответ

2 голосов
/ 26 июля 2010

Стандарты C99 и C ++ 0x указывают, что их соответствующие двойные комплексные типы должны иметь такое же выравнивание и расположение, что и массив из двух двойных. Это означает, что вы можете обойтись без передачи аргументов как void *, и ваши подпрограммы будут (относительно) легко вызываться из любого языка, и этот подход используется многими библиотеками.

Стандарт C ++ 0x гарантирует (§26.4), что reinterpret_cast от std::complex<double>* до double* будет делать правильные вещи; если я правильно помню, это не было так четко указано в более ранних версиях стандарта. Если вы хотите использовать C ++ 0x, вы можете использовать это, чтобы сделать что-то более чистое для ваших интерфейсов.

Учитывая, что фактические макеты и спецификации выравнивания определены для согласования, я бы соблазнился просто обусловить тип в заголовочном файле на языке; Ваша реализация может использовать любой язык, и данные будут правильно размещены в памяти в любом случае. Я не уверен, как MATLAB делает что-то внутренне, поэтому я не знаю, совместимо ли это с MATLAB или нет; если они используют стандартный подход LAPACK, то это будет на многих, но не на всех платформах при любых обстоятельствах; LAPACK определяет свой собственный тип double complex как struct с двумя double элементами, которые будут обычно размещаться в памяти таким же образом (это не гарантируется), но могут следовать различные соглашения о вызовах на некоторых платформах.

...