j'aimerais pouvoir utiliser dans un programme en C une bibliothèque
écrite en C++ proposant une interface pour le C++ (fichier .h) mais
aussi pour du fortran 90 (ce qui me laisse penser qu'il y a une
certaine souplesse dans l'utilisation de la bibliothèque, même si la
seconde interface semble légèrement plus restreinte (à en croire la
description officielle) que l'autre. Dans la mesure où je suis habitué
à appeler quelque chose d'écrit en C depuis du Fortran, je me demande
dans quelle mesure je pourrais ici appeler la bibliothèque depuis du C.
Comme je ne connais pas le C++, je ne sais pas trop que faire ; je
pense que le meilleur groupe pour poser la questio est bien ici car
c'est vraiment la solution en C qui m'intéresse. Je copie le fichier .h
pour donner une idée de ce dont il s'agit (il s'agit de la bibliothèqe QD :
http://crd.lbl.gov/~dhbailey/mpdist/qd.tar.gz écrite par Bailey).
/*
* include/qd.h
*
* This work was supported by the Director, Office of Science, Division
* of Mathematical, Information, and Computational Sciences of the
* U.S. Department of Energy under contract number DE-AC03-76SF00098.
*
* Copyright (c) 2000-2001
*
* Quad-double precision (>= 212-bit significand) floating point arithmetic
* package, written in ANSI C++, taking full advantage of operator overloading.
* Uses similar techniques as that of David Bailey's double-double package
* and that of Jonathan Shewchuk's adaptive precision floating point
* arithmetic package. See
*
* http://www.nersc.gov/~dhbailey/mpdist/mpdist.html
* http://www.cs.cmu.edu/~quake/robust.html
*
* for more details.
*
* Yozo Hida
*/
#ifndef _QD_H_
#define _QD_H_
#include <iostream>
#include "dd.h"
using std::ostream;
using std::istream;
class qd_real {
protected:
double x[4]; /* The Components. */
/* Eliminates any zeros in the middle component(s). */
void zero_elim();
void zero_elim(double &e);
/* Computes qd * d where d is known to be a power of 2.
This can be done component wise. */
friend qd_real mul_pwr2(const qd_real &qd, double d);
/* Sin / Cos Tables */
static const qd_real _pi1024; /* Used in sin / cos routine. */
static const qd_real sin_table[];
static const qd_real cos_table[];
/* Other Comparisons. These are faster than directly
comparing to 0 or 1. */
bool is_zero() const;
bool is_one() const;
bool is_positive() const;
bool is_negative() const;
/* Micellaneous algebraic operations */
friend qd_real fabs(const qd_real &a);
friend qd_real abs(const qd_real &a); /* same as fabs */
/* Computes a * 2^n. */
friend qd_real ldexp(const qd_real &a, int n);
--
Thomas Baruchel --- Home Page: http://baruchel.free.fr/~thomas/
write to baruchel at the host called bluebottle dot com
écrire à baruchel chez l'hôte nommé bluebottle point com
(you will be asked for a confirmation the first time you write)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Anthony Fleury
Bonjour,
Bonjour,
j'aimerais pouvoir utiliser dans un programme en C une bibliothèque écrite en C++ proposant une interface pour le C++ (fichier .h) mais aussi pour du fortran 90 (ce qui me laisse penser qu'il y a une certaine souplesse dans l'utilisation de la bibliothèque, même si la seconde interface semble légèrement plus restreinte (à en croire la description officielle) que l'autre.
Bah ce n'est pas si souple que ca en a l'air...
Dans la mesure où je suis habitué à appeler quelque chose d'écrit en C depuis du Fortran, je me demande dans quelle mesure je pourrais ici appeler la bibliothèque depuis du C. Comme je ne connais pas le C++, je ne sais pas trop que faire ; je pense que le meilleur groupe pour poser la questio est bien ici car c'est vraiment la solution en C qui m'intéresse. Je copie le fichier .h pour donner une idée de ce dont il s'agit (il s'agit de la bibliothèqe QD : http://crd.lbl.gov/~dhbailey/mpdist/qd.tar.gz écrite par Bailey).
Il faudrait savoir exactement ce qui est prévu de faire de cette bibliothèque. Si j'ai bien vu, elle offre des nombres à plus haute précision que ce qu'exige la norme. Soit. Voyons ce fichier .h :
[...]
class qd_real { protected: double x[4]; /* The Components. */
Elle offre : une classe pour les réels (une sorte de structure mais qui peut contenir des fonctions, possède un constructeur etc... (en très gros, désolé pour les puristes C++, c'est pour le bien de l'explication). Et pour cette classe, on définit des opérateurs. En C++ on peut surcharger les opérateurs, donc une opération telle que :
qd_real a, b, c;
a = b+c; appelera operator+(b, c) et mettra le resultat dans a.
En gros, ce n'est donc pas facile de s'interfacer en C avec ceci pour utiliser leurs nombres réels... Il faut refaire une interface, donc refaire le boulot qui a dû être fait pour Fortran 90... Bonne chance :-) Là où ca se fait ce sont pour des bibliothèques prévues pour, avec des extern "C" et pour appeler des fonctions. Mais là pour utiliser une classe...
Ou alors j'ai loupé un truc, et j'attends des corrections.
-- Anthony Fleury
Bonjour,
Bonjour,
j'aimerais pouvoir utiliser dans un programme en C une bibliothèque
écrite en C++ proposant une interface pour le C++ (fichier .h) mais
aussi pour du fortran 90 (ce qui me laisse penser qu'il y a une
certaine souplesse dans l'utilisation de la bibliothèque, même si la
seconde interface semble légèrement plus restreinte (à en croire la
description officielle) que l'autre.
Bah ce n'est pas si souple que ca en a l'air...
Dans la mesure où je suis habitué
à appeler quelque chose d'écrit en C depuis du Fortran, je me demande
dans quelle mesure je pourrais ici appeler la bibliothèque depuis du C.
Comme je ne connais pas le C++, je ne sais pas trop que faire ; je
pense que le meilleur groupe pour poser la questio est bien ici car
c'est vraiment la solution en C qui m'intéresse. Je copie le fichier .h
pour donner une idée de ce dont il s'agit (il s'agit de la bibliothèqe QD :
http://crd.lbl.gov/~dhbailey/mpdist/qd.tar.gz écrite par Bailey).
Il faudrait savoir exactement ce qui est prévu de faire de cette
bibliothèque. Si j'ai bien vu, elle offre des nombres à plus haute
précision que ce qu'exige la norme. Soit.
Voyons ce fichier .h :
[...]
class qd_real {
protected:
double x[4]; /* The Components. */
Elle offre : une classe pour les réels (une sorte de structure mais qui
peut contenir des fonctions, possède un constructeur etc... (en très
gros, désolé pour les puristes C++, c'est pour le bien de
l'explication). Et pour cette classe, on définit des opérateurs. En C++
on peut surcharger les opérateurs, donc une opération telle que :
qd_real a, b, c;
a = b+c; appelera operator+(b, c) et mettra le resultat dans a.
En gros, ce n'est donc pas facile de s'interfacer en C avec ceci pour
utiliser leurs nombres réels... Il faut refaire une interface, donc
refaire le boulot qui a dû être fait pour Fortran 90... Bonne chance :-)
Là où ca se fait ce sont pour des bibliothèques prévues pour, avec des
extern "C" et pour appeler des fonctions. Mais là pour utiliser une
classe...
Ou alors j'ai loupé un truc, et j'attends des corrections.
j'aimerais pouvoir utiliser dans un programme en C une bibliothèque écrite en C++ proposant une interface pour le C++ (fichier .h) mais aussi pour du fortran 90 (ce qui me laisse penser qu'il y a une certaine souplesse dans l'utilisation de la bibliothèque, même si la seconde interface semble légèrement plus restreinte (à en croire la description officielle) que l'autre.
Bah ce n'est pas si souple que ca en a l'air...
Dans la mesure où je suis habitué à appeler quelque chose d'écrit en C depuis du Fortran, je me demande dans quelle mesure je pourrais ici appeler la bibliothèque depuis du C. Comme je ne connais pas le C++, je ne sais pas trop que faire ; je pense que le meilleur groupe pour poser la questio est bien ici car c'est vraiment la solution en C qui m'intéresse. Je copie le fichier .h pour donner une idée de ce dont il s'agit (il s'agit de la bibliothèqe QD : http://crd.lbl.gov/~dhbailey/mpdist/qd.tar.gz écrite par Bailey).
Il faudrait savoir exactement ce qui est prévu de faire de cette bibliothèque. Si j'ai bien vu, elle offre des nombres à plus haute précision que ce qu'exige la norme. Soit. Voyons ce fichier .h :
[...]
class qd_real { protected: double x[4]; /* The Components. */
Elle offre : une classe pour les réels (une sorte de structure mais qui peut contenir des fonctions, possède un constructeur etc... (en très gros, désolé pour les puristes C++, c'est pour le bien de l'explication). Et pour cette classe, on définit des opérateurs. En C++ on peut surcharger les opérateurs, donc une opération telle que :
qd_real a, b, c;
a = b+c; appelera operator+(b, c) et mettra le resultat dans a.
En gros, ce n'est donc pas facile de s'interfacer en C avec ceci pour utiliser leurs nombres réels... Il faut refaire une interface, donc refaire le boulot qui a dû être fait pour Fortran 90... Bonne chance :-) Là où ca se fait ce sont pour des bibliothèques prévues pour, avec des extern "C" et pour appeler des fonctions. Mais là pour utiliser une classe...
Ou alors j'ai loupé un truc, et j'attends des corrections.
-- Anthony Fleury
Thierry Perrin
Bonjour,
Pour l'avoir fait de façon ponctuelle sur des dll, il n'est pas possible d'appeler directement du C++ à partir du C en C pure. Il faut pour certain compilateur utiliser de l'assembleur. Par exemple msdev utilise le registre ecx sur Pentium pour transférer this à la méthode. Ensuite vient le problème de la décoration (mangling). Les symboles exportés par les compilateurs C++ sont adaptés pour éviter de violer les règles du C++ au moment de l'édition de liens des fichiers objets. On trouve des choses du genre ?? Ce qui ne constitue pas un identifieur valide pour le langage C. Ce dernier problème peut être contourner s'il est possible d'utiliser une bibliothèque partagée (.dll ou .so).
Thierry Perrin
Bonjour,
Pour l'avoir fait de façon ponctuelle sur des dll, il n'est pas possible d'appeler
directement du C++ à partir du C en C pure. Il faut pour certain compilateur
utiliser de l'assembleur. Par exemple msdev utilise le registre ecx sur
Pentium pour transférer this à la méthode. Ensuite vient le problème de la
décoration (mangling). Les symboles exportés par les compilateurs C++ sont
adaptés pour éviter de violer les règles du C++ au moment de l'édition de
liens des fichiers objets. On trouve des choses du genre ??0Maclass@... Ce
qui ne constitue pas un identifieur valide pour le langage C. Ce dernier
problème peut être contourner s'il est possible d'utiliser une bibliothèque
partagée (.dll ou .so).
Pour l'avoir fait de façon ponctuelle sur des dll, il n'est pas possible d'appeler directement du C++ à partir du C en C pure. Il faut pour certain compilateur utiliser de l'assembleur. Par exemple msdev utilise le registre ecx sur Pentium pour transférer this à la méthode. Ensuite vient le problème de la décoration (mangling). Les symboles exportés par les compilateurs C++ sont adaptés pour éviter de violer les règles du C++ au moment de l'édition de liens des fichiers objets. On trouve des choses du genre ?? Ce qui ne constitue pas un identifieur valide pour le langage C. Ce dernier problème peut être contourner s'il est possible d'utiliser une bibliothèque partagée (.dll ou .so).
Thierry Perrin
Anthony Fleury
Bonjour,
Bonjour,
[...]
Ensuite vient le problème de la décoration (mangling). Les symboles exportés par les compilateurs C++ sont adaptés pour éviter de violer les règles du C++ au moment de l'édition de liens des fichiers objets. On trouve des choses du genre ?? Ce qui ne constitue pas un identifieur valide pour le langage C. Ce dernier problème peut être contourner s'il est possible d'utiliser une bibliothèque partagée (.dll ou .so).
<HS>
C'est surtout qu'un compilateur C++ devra faire avec ce qui la surcharge. Il devra donc adapter le nom des fonctions avec le type d'arguments qu'elle recoit, afin de ne pas avoir deux fonctions avec le même identifiant au final (void f(void) et void f(int) aurait le même identifiant avec la convention à la C). Cette décoration n'est pas décrite dans la norme donc tous les compilateurs la font comme ils veulent (ce qui est embetant pour les programmeurs de ce langage car une bibliothèque est prévue pour un compilateur précis à cause de ceci).
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un programme C, il déclarera le tout dans un bloc extern "C" ce qui fait que les conventions d'appel seront les mêmes qu'en C. Ce n'est donc pas spécifique aux bibliothèques partagées, il faut que la convention d'appel "à la C" ait été prévue par le programmeur C++. Bien sûr, on ne pourra pas avoir de surcharge de fonction dans un bloc extern "C" vu que le C l'interdit.
</HS>
-- Anthony Fleury
Bonjour,
Bonjour,
[...]
Ensuite vient le problème de la
décoration (mangling). Les symboles exportés par les compilateurs C++ sont
adaptés pour éviter de violer les règles du C++ au moment de l'édition de
liens des fichiers objets. On trouve des choses du genre ??0Maclass@... Ce
qui ne constitue pas un identifieur valide pour le langage C. Ce dernier
problème peut être contourner s'il est possible d'utiliser une bibliothèque
partagée (.dll ou .so).
<HS>
C'est surtout qu'un compilateur C++ devra faire avec ce qui la
surcharge. Il devra donc adapter le nom des fonctions avec le type
d'arguments qu'elle recoit, afin de ne pas avoir deux fonctions avec le
même identifiant au final (void f(void) et void f(int) aurait le même
identifiant avec la convention à la C). Cette décoration n'est pas
décrite dans la norme donc tous les compilateurs la font comme ils
veulent (ce qui est embetant pour les programmeurs de ce langage car une
bibliothèque est prévue pour un compilateur précis à cause de ceci).
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un
programme C, il déclarera le tout dans un bloc extern "C" ce qui fait
que les conventions d'appel seront les mêmes qu'en C. Ce n'est donc pas
spécifique aux bibliothèques partagées, il faut que la convention
d'appel "à la C" ait été prévue par le programmeur C++. Bien sûr, on ne
pourra pas avoir de surcharge de fonction dans un bloc extern "C" vu que
le C l'interdit.
Ensuite vient le problème de la décoration (mangling). Les symboles exportés par les compilateurs C++ sont adaptés pour éviter de violer les règles du C++ au moment de l'édition de liens des fichiers objets. On trouve des choses du genre ?? Ce qui ne constitue pas un identifieur valide pour le langage C. Ce dernier problème peut être contourner s'il est possible d'utiliser une bibliothèque partagée (.dll ou .so).
<HS>
C'est surtout qu'un compilateur C++ devra faire avec ce qui la surcharge. Il devra donc adapter le nom des fonctions avec le type d'arguments qu'elle recoit, afin de ne pas avoir deux fonctions avec le même identifiant au final (void f(void) et void f(int) aurait le même identifiant avec la convention à la C). Cette décoration n'est pas décrite dans la norme donc tous les compilateurs la font comme ils veulent (ce qui est embetant pour les programmeurs de ce langage car une bibliothèque est prévue pour un compilateur précis à cause de ceci).
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un programme C, il déclarera le tout dans un bloc extern "C" ce qui fait que les conventions d'appel seront les mêmes qu'en C. Ce n'est donc pas spécifique aux bibliothèques partagées, il faut que la convention d'appel "à la C" ait été prévue par le programmeur C++. Bien sûr, on ne pourra pas avoir de surcharge de fonction dans un bloc extern "C" vu que le C l'interdit.
</HS>
-- Anthony Fleury
Thomas Baruchel
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un programme C, il déclarera le tout dans un bloc extern "C" ce qui fait
Je vous remercie tous les deux pour vos réponses ; en fait, je ne m'étais pas rendu compte que le programmeur avait fait un gros effort d'interfaçage qui permattait d'utiliser la bibliothèque depuis du C++ et du Fortran, mais aussi... depuis du C. Entre temps, j'ai codé mon projet en Fortran, donc tant pis, mais à l'avenir je saurais que le C a été prévu.
Cordialement,
-- Thomas Baruchel --- Home Page: http://baruchel.free.fr/~thomas/ write to baruchel at the host called bluebottle dot com écrire à baruchel chez l'hôte nommé bluebottle point com (you will be asked for a confirmation the first time you write)
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un
programme C, il déclarera le tout dans un bloc extern "C" ce qui fait
Je vous remercie tous les deux pour vos réponses ; en fait, je ne m'étais
pas rendu compte que le programmeur avait fait un gros effort d'interfaçage
qui permattait d'utiliser la bibliothèque depuis du C++ et du Fortran, mais
aussi... depuis du C. Entre temps, j'ai codé mon projet en Fortran, donc
tant pis, mais à l'avenir je saurais que le C a été prévu.
Cordialement,
--
Thomas Baruchel --- Home Page: http://baruchel.free.fr/~thomas/
write to baruchel at the host called bluebottle dot com
écrire à baruchel chez l'hôte nommé bluebottle point com
(you will be asked for a confirmation the first time you write)
Quand le programmeur a prévu que sa fonction sera appelée à partir d'un programme C, il déclarera le tout dans un bloc extern "C" ce qui fait
Je vous remercie tous les deux pour vos réponses ; en fait, je ne m'étais pas rendu compte que le programmeur avait fait un gros effort d'interfaçage qui permattait d'utiliser la bibliothèque depuis du C++ et du Fortran, mais aussi... depuis du C. Entre temps, j'ai codé mon projet en Fortran, donc tant pis, mais à l'avenir je saurais que le C a été prévu.
Cordialement,
-- Thomas Baruchel --- Home Page: http://baruchel.free.fr/~thomas/ write to baruchel at the host called bluebottle dot com écrire à baruchel chez l'hôte nommé bluebottle point com (you will be asked for a confirmation the first time you write)