Utilisation des complexes de la STL

Résolu
cs_Fr33z Messages postés 6 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 17 juillet 2008 - 17 juil. 2008 à 03:41
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 - 17 juil. 2008 à 19:36
Bonjour à tous,

 j'aurais aimé savoir comment je peux faire pour changer la valeur "manuellement" d'un nombre complexe défini à l'aide des templates complex STL :

#include <complex>

using namespace std;

int main()
{
  complex<long double> a(3,4);
  //ici a vaut 3+4i
  
  //là j'aimerai par exemple changer sa valeur à 5+6i, par exemple
}

J'aimerais pouvoir changer cette valeur sans avoir à reconstruire l'objet car cette opération doit être effectuée un grand nombre de fois et rapidement... De plus, je sais que le constructeur est surchargé , et que l'on peut séparer la déclaration de l'affectation car une instruction du type complex<long double> a; ne génère pas d'erreur... Mais que mettre après ? a=(5,6) par exemple ne fonctionne pas...

Merci d'avance !

10 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
17 juil. 2008 à 10:16
Bonjour,

Voilà un exemple :

#include <stdio.h>
#include <complex>



using namespace std;



int main()
{
  complex<long double> a(3,4);
  //ici a vaut 3+4i
  printf("a = %.2lf + %.2lfi\n",a.real(),a.imag());




  //là j'aimerai par exemple changer sa valeur à 5+6i, par exemple
  a.real(5);
  a.imag(6);
  printf("a = %.2lf + %.2lfi\n",a.real(),a.imag());
}


Ce qui donne :

a = 3.00 + 4.00i
a = 5.00 + 6.00i



Jean-François
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
17 juil. 2008 à 10:52
C'est refusé sous Visual C++ 6.0 (et heureusement car ça ne veut rien dire) !
Vous utilisez quel compilateur ?

Il y a aussi a = 5; pour générer 5+0i  (partie imaginaire nulle systématiquement).

Jean-François
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 juil. 2008 à 13:30
"C'est refusé sous Visual C++ 6.0 (et heureusement car ça ne veut rien dire) !"
=> Bien sur que si, ca veut dire quelque chose. Cette syntaxe est tout a fait correcte:
a.real() = 5;
a.imag() = 6;

Puisque si vous regardez la classe Complex, vous trouvez les deux fonctions suivantes:
///  Return real part of complex number.
      _Tp& real();
///  Return imaginary part of complex number.
      _Tp& imag();

Ce qui rend la syntaxe ci dessus légale et normale. Peut etre que sous Visual C++ 6.0, l'implémentation est légèrement différente.
3
cs_Fr33z Messages postés 6 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 17 juillet 2008
17 juil. 2008 à 10:21
Bonjour, merci pour cette réponse.
J'ai également trouvé une autre façon cette nuit :

a.real() = 5;
a.imag() = 6;

Cette syntaxe semble également fonctionner...
Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Fr33z Messages postés 6 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 17 juillet 2008
17 juil. 2008 à 11:09
J'utilise GNU GCC Compiler, celui par defaut avec code::blocks. Connaissez vous les avantages/désavangages de Visual c++ par rapport à code::blocks ? J'envisage de changer d'ide, et Visual c++ a l'air plus complet...

Je me disais bien que cette syntaxe était vraiment étrange.
J'ai refait des essais, et cette syntaxe n'a plus compilé. J'avais dû faire une erreur.

Cordialement
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
17 juil. 2008 à 11:36
J'utilise Visual C++ 6.0 depuis qu'il est sorti (en 1998 je crois) et j'en suis très content (je n'utilise absolument pas la partie "Visual", je code tout --> je maîtrise tout). Il ne connaît pas les dernières nouveautés disponibles sous Windows mais je les ajoutent au fur et à mesure de mes besoins ! Bien sûr il y a des versions beaucoup plus récentes et dispo en version gratuite (mais limitée) comme Visual C++ 2008 Express.

Quant à Code::Blocks je l'ai installé il y a quelques mois pour tester une réponse faite ici et tout c'est bien passé ! Tous les codes faits sous Visual C++ testés sous Code::Blocks sont passés à un détail près concernant les déclarations des variables dans les boucles for ! (la variable est locale à la boucle avec Code::Blocks et continue d'exister après la boucle avec Visual C++, je trouve que Code::Blocks est plus "propre" dans ce cas là).

Jean-François
0
cs_Fr33z Messages postés 6 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 17 juillet 2008
17 juil. 2008 à 11:42
Merci beaucoup pour ces précisions.
Je vais donc me procurer la version limitée pour me forger une opinion.
(c'est curieux pour la portée des variables, je croyais la norme c++ indique la portée de la variable à l'intérieur de la boucle...)
 
Cordialement.
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
17 juil. 2008 à 14:39
Cette spécification est absurde. "fonction = qq chose" ça ne veut rien dire, c'est une absurdité sémantique : une fonction ça retourne qq chose, explicitement ou implicitement, ça ne prend pas qq chose !

Et en ce qui concerne C++ cette absurdité ne fonctionne que si la fonction retourne une référence ce qui n'est pas le cas ici sous VC++ !

Jean-François
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 juil. 2008 à 17:51
Non cette spécification est parfaitement correcte. Une fonction ca ne représente rien ! c'est uniquement son type de retour qui a un sens. Et en l'occurence il s'agit d'un référence, ou encore d'un pointeur déguisé.
""fonction qq chose" ça ne veut rien dire"> Il s'agit plutot de : "ce que la fonction retourne = qq chose"

"Et en ce qui concerne C++ cette absurdité ne fonctionne que si la fonction retourne une référence"
=> Bas oui, c'est justement le cas ici:
///  Return real part of complex number.
      _Tp& real();
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
17 juil. 2008 à 19:36
Bonsoir,

Sous VS 2005, la méthode
    _Tp& real();
n'existe pas non plus. J'ai l'impression que cela dépend de l'implémentation, donc méfiance...

Attention aussi à
    a = 5.0 + 6.0i ;
car l'opérateur d'affectation fait appel à un constructeur... mais est-ce bien si grave ?
0
Rejoignez-nous