Utilisation des complexes de la STL [Résolu]

Signaler
Messages postés
6
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
17 juillet 2008
-
cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
-
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

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
"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.
Messages postés
6
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
17 juillet 2008

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
Messages postés
6
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
17 juillet 2008

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
6
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
17 juillet 2008

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.
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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();
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
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 ?