2

我正在编写一个数学库,它的核心是 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 和其他可能的数值环境。

4

1 回答 1

2

C99 和 C++0x 标准都指定它们各自的双精度复数类型必须具有与两个双精度数组相同的对齐和布局。这意味着您可以避免将参数作为 a 传递,void *并使您的例程(相对)容易从任何一种语言调用,这是许多库采用的方法。

C++0x 标准保证(第 26.4 节) a reinterpret_castof std::complex<double>*todouble*会做正确的事;如果我没记错的话,这在标准的早期版本中并没有明确规定。如果您愿意以 C++0x 为目标,您可以使用它为您的接口做一些更清洁的事情。

鉴于实际的布局和对齐规范被定义为一致,我很想仅将头文件中的类型作为语言的条件;您的实现可以使用任何一种语言,并且无论哪种方式,数据都将在内存中正确布局。我不确定 MATLAB 在内部是如何做事的,所以我不知道这是否与 MATLAB 兼容;如果他们使用标准的 LAPACK 方法,那么它将在许多但不是所有平台上在所有情况下;LAPACK 将自己的double complex类型定义为struct具有两个double成员的 a,通常在内存中以相同的方式布局(不能保证),但在某些平台上可能遵循不同的调用约定。

于 2010-07-26T12:29:09.747 回答