2010-07-26 23 views
2

J'écris une bibliothèque mathématique, dont le noyau est en C++. Plus tard, il peut être implémenté en C pur (C99 je suppose). Je pense que j'ai besoin d'une API C like pour pouvoir utiliser Python et matlab et autres pour utiliser la bibliothèque. Mon impression est que faire cela avec C++ est douloureux.types de nombres complexes dans le mélange C (99) et C++

Y a-t-il une bonne ou une façon standard ou correcte de transposer entre double complex *some_array_in_C99 et complex<double> *some_array_in_cpp?

Je pourrais juste utiliser les pointeurs void *, mais je ne suis pas sûr que ce soit bon.

Cela peut être difficile, parce que ctypes semble bien fonctionner avec complex<double>, mais je suis inquiet à propos de matlab et d'autres environnements numériques possibles.

+0

Etes-vous sûr de pouvoir utiliser le complexe C99 avec MATLAB? – kennytm

+0

er, bon point. de http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_external/f21585.html complexes double précision Matrices Le type de données le plus courant dans MATLAB est le complexe double précision, matrice non faible . Ces matrices sont de type double et ont des dimensions m-by-n, où m est le nombre de lignes et n est le nombre de colonnes. Les données sont stockées sous la forme de deux vecteurs de nombres à double précision: l'un contient les données réelles et l'autre contient les données imaginaires. Alors c'est facile. Je peux m'inquiéter de rien. –

Répondre

2

Les normes C99 et C++ 0x spécifient toutes deux que leurs types complexes doubles doivent avoir le même alignement et la même disposition qu'un tableau de deux doubles. Cela signifie que vous pouvez vous en passer en passant des arguments en tant que void * et que vos routines sont (relativement) facilement appelables de l'une ou l'autre langue, et c'est une approche que de nombreuses bibliothèques ont adoptée. Le standard C++ 0x garantit (§26.4) qu'un reinterpret_cast de std::complex<double>* à double* fera le bon choix; si je me souviens bien, cela n'était pas clairement spécifié dans les versions antérieures de la norme. Si vous souhaitez cibler C++ 0x, il est possible que vous utilisiez ceci pour faire quelque chose de plus propre pour vos interfaces. Etant donné que les spécifications de mise en page et d'alignement sont définies pour être d'accord, je serais tenté de simplement conditionner le type dans le fichier d'en-tête sur la langue; Votre implémentation peut utiliser l'une ou l'autre langue, et les données seront correctement mises en mémoire dans les deux sens. Je ne suis pas sûr de savoir comment MATLAB fait les choses en interne, donc je ne sais pas si cela est compatible avec MATLAB ou non; S'ils utilisent l'approche LAPACK standard, alors ce sera sur beaucoup, mais pas toutes, en toutes circonstances; LAPACK définit son propre type double complex comme étant un struct avec deux membres double, qui sera habituellement être disposé de la même manière en mémoire (ceci n'est pas garanti), mais pourrait suivre une convention d'appel différente sur certaines plateformes.

+0

Super, merci pour votre réponse. -entaille –