OVH Cloud OVH Cloud

compilateur ne veut plus

21 réponses
Avatar
Christophe Schneider
//programme de conversion de nombres binaires en nombres décimaux.

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
double cp=0,bin=0,dec=0;

cout<<"nombre : ";
cin>>bin;

while(cp<20){
dec = dec + ((bin % 2)*(pow(2,cp))); ///couac
cout<<bin<<" "<<dec<<endl;
bin = bin/10;
++cp;
}
system("PAUSE");
return 0;
}

le compilateur bloque sur cette ligne : dec = dec + ((bin %
2)*(pow(2,cp)));
pourquoi ???
merci d'avance.

10 réponses

1 2 3
Avatar
Fabien LE LEZ
On Wed, 03 Dec 2003 22:22:48 +0100, Benoit Rousseau
wrote:

Le ET-logique est une fonction asm sur x86 (AND), alors je ne
pense pas qu'il y ait beaucoup de code généré ou qu'il y ait des
problèmes de vitesses.


Ce que Michel voulait dire (je suppose), c'est que "bin % 2" est plus
clair, et que tout bon compilateur est sensé générer le même code que
pour "bin & 1".

--
;-)

Avatar
PHAM Minh Quang
"Christophe" a écrit dans le message de
news:3fce28f0$0$17141$
ca ne parait pas necessaire, puisque je me sert un peu de pow() sans
jamais

déclarer.
merci a+


En C++, toujours éviter de prendre ce que dit le compilateur comme parole
d'évangile, surtout quand il est ancien et ne respecte pas encore le
standard iso, ce que la plupart des compilateurs tendent à faire ( même chez
Microsoft ).
Cela passe parfois en C, où quand le prototype de la fonction n'est pas
déclaré le compilateur suppose qu'elle retourne intrinsèquement un 'int',
mais plus en C++ moderne.

Avatar
Michel Michaud
Dans news:3fce541b$0$300$, Benoit
Michel Michaud wrote:
"Benoit Rousseau" a écrit dans le message de
news:3fce235e$0$5476$

Ceci dit, je pense que %2 se fait plus simplement avec
(bin & 1) //ET binaire



Plus simplement ? En tout cas, pas pour la qualité du code et
probablement pas pour le code généré ou pour la vitesse...


Bof... Le ET-logique est une fonction asm sur x86 (AND), alors je ne
pense pas qu'il y ait beaucoup de code généré ou qu'il y ait des
problèmes de vitesses.


Je parlais en général et dans l'autre sens. Écrire %2 n'est
probablement pas pire que &1 au niveau du code généré et, en
fait, le compilateur est le seul à savoir ce qui est le mieux.
Il ne suffit peut-être pas de considérer l'instruction individuelle,
etc. Écrire % 2 est plus clair et jusqu'à preuve du contraire avec
un compilateur donné, je ne dirais pas d'écrire &1. Il y a des

Un ET-logique est l'opération de base d'un half-adder... Si elle
n'est
pas codée en dure, je me demande à quoi m'ont servi mes cours de
hardware... L'opération est tellement courante qu'elle doit être
implantée sur les autres architectures...


Oui, mais elle n'est pas nécessairement la plus rapide entre toutes
les possibilités, sur toutes les architectures. En C++, on ne
devrait pas essayer de contrôler ces détails. Si on est rendu à
vouloir absolument gagner un cycle ou deux, il faut écrire en
assembleur. Écrire &1 ne garantit pas que le compilateur fera la
bonne chose, même si c'est ce qui est le plus rapide !

et "a*pow(2, cp)" peut être remplacé par (a << cp); décallage de
cp
bits vers la gauche (cp multiplications par 2)



Ce sera possible seulement si il n'utilise pas des double...


L'algorithme présenté n'a pas besoin de doubles, mais de long...


Mais ce n'est pas un remplacement de l'expression a*pow(2, cp)
comme tu l'indiquais.

Pour revenir à la demande de clarification de Chritophe :

(a & b) est l'opérateur ET-logique : il effectue un & sur chacun des
bits de a et b. Le "premier" bit de "a" détermine la parité de a.
En "binaire" 0010 est pair (=2) et 0101 est impaire (=5).


Tiens, ça me fait penser que &1 ne fonctionnerait pas avec les
négatifs sur des architectures en complément à 1 (je sais, c'est
rare, seul James a vu ça ici !).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Michel Michaud
Dans news:, Fabien LE
On Wed, 03 Dec 2003 22:22:48 +0100, Benoit Rousseau
wrote:

Le ET-logique est une fonction asm sur x86 (AND), alors je ne
pense pas qu'il y ait beaucoup de code généré ou qu'il y ait des
problèmes de vitesses.


Ce que Michel voulait dire (je suppose), c'est que "bin % 2" est
plus clair, et que tout bon compilateur est sensé générer le même
code que pour "bin & 1".


En fait, j'espère que le compilateur choisira la meilleure solution
pour ce qu'on essaie de faire... (il pourrait faire % 2 si on demande
& 1 !)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Michel Michaud
Dans news:3fce393c$0$24017$,
Question relative à ta réponse, j'ai dev-c++ mais celui-ci ne donne
jamais aucun message, il se contente d'amener le curseur sur la
ligne erronée : est-il mal paramètre...???


J'imagine (j'espère !), mais je ne le connais pas.

Si ton compilateur ne donne vraiment aucun message, change de
compilateur au moins pendant l'apprentissage de C++, donc pour
les 10 prochaines années au moins :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Laurent DELEPINE
Christophe Schneider wrote:
//programme de conversion de nombres binaires en nombres décimaux.

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
double cp=0,bin=0,dec=0;

cout<<"nombre : ";
cin>>bin;

while(cp<20){
dec = dec + ((bin % 2)*(pow(2,cp))); ///couac
cout<<bin<<" "<<dec<<endl;
bin = bin/10;
++cp;
}
system("PAUSE");
return 0;
}

le compilateur bloque sur cette ligne : dec = dec + ((bin %
2)*(pow(2,cp)));
pourquoi ???


Mes collegues ont oublié le fait que bin et dec sont des manipulateurs.
Ils servent à convertir les entiers en decimal ou binaire dans les flux
de sortie. Je te conseille de changer le nom de tes variables.


A+

LD

Avatar
Pierre Maurette
"Michel Michaud" a écrit
[...]
De toute façon, le programme original n'est vraiment pas fait de la
meilleure manière (et savoir ce qu'on peut faire demande qu'on
connaisse l'énoncé exact, ça semble bien être un travail d'école).
Oui, le "scope of worke est bien obscur pour moi.

Que viennent faire des double ?
Un nombre n'est ni binaire, ni décimal (ou alors il est toujours binaire,
peu importe). Il me semble qu'une "conversion de nombres binaires en nombres
décimaux" est une conversion chaine vers chaine, et de plus il faut préciser
décimal signé ou décimal non signé. Ou alors, je n'ai rien compris.
Les fonctions genre ?printf() ou le cout se chargent de la conversion entier
vers chaine, donc il suffirait d'écrire chaine (expression en binaire) vers
entier. Un bout de code à corriger et à améliorer (ajouter des 0 à gauche,
traiter les erreurs par exception pour ne pas utiliser le 0 à cette fin,
vérifier la portabilité, etc ... Ecrit pour des entier de la taille du char
pour simplifier les tests :
#include<iostream>
#include<string>
//#include<istream>
//#include<ostream>

#ifdef __BORLANDC__
#pragma argsused
#endif

typedef unsigned char ubyte;
typedef signed char sbyte;

ubyte Valeur8(std::string ChaineAConvertir);

int main( int argc, char * argv[] )
{
sbyte SResult;
ubyte* pUResult;
std::string entree;
std::cin >> entree;
SResult = Valeur8(entree);
pUResult = (ubyte*) &SResult;
std::cout << (int) SResult << std::endl;
std::cout << (unsigned int) *pUResult << std::endl;
return 0;
}

ubyte Valeur8(std::string st)
{
ubyte retour = 0;
if (st.length() == sizeof(ubyte) * 8)
{
for (int compteur = 0; compteur < sizeof(ubyte) * 8; compteur++)
{
retour = retour << 1;
if(st[compteur] != '0')
{
if(st[compteur] != '1')return 0;
retour++;
}
}
}
return retour;
}

Pierre

Avatar
kanze
"Michel Michaud" wrote in message
news:<zqvzb.11549$...

[...]
Tiens, ça me fait penser que &1 ne fonctionnerait pas avec les
négatifs sur des architectures en complément à 1 (je sais, c'est rare,
seul James a vu ça ici !).


Le décalage proposé n'est pas garanti pour les négatifs non plus.

En fait, quand on travaille à ce niveau-là, il vaut mieux prendre les
unsigned.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Fabien LE LEZ
On Thu, 04 Dec 2003 11:47:09 +0100, Laurent DELEPINE
wrote:

using namespace std;


Mes collegues ont oublié le fait que bin et dec sont des manipulateurs.
Ils servent à convertir les entiers en decimal ou binaire dans les flux
de sortie. Je te conseille de changer le nom de tes variables.


Ou enlever le "using namespace std;"...

--
;-)


Avatar
Christophe
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> a écrit
dans le message de news:3fcf5c87$0$29080$
"Michel Michaud" a écrit
vers chaine, donc il suffirait d'écrire chaine (expression en binaire)
vers

entier. Un bout de code à corriger et à améliorer (ajouter des 0 à gauche,
traiter les erreurs par exception pour ne pas utiliser le 0 à cette fin,
vérifier la portabilité, etc ... Ecrit pour des entier de la taille du
char...


Oufff............
J'en suis à la page 151 sur 1178 de comment programmer C++.
Promis-juré : quand j'aurais fini le bouquin je corrigerais vos copies ;-)
Pour l'instant j'essaie de comprendre à quoi sert "coût" ;-)
C'est dur et long tout seul => beaucoup moins grâce à vous.
Merci à tous.

1 2 3