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
Benoit Rousseau
Christophe Schneider wrote:

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

Parceque tu n'as pas le droit de faire un % sur un double...

Utilise des long à la place... Ou une convertion (long)bin % 2

Ceci dit, je pense que %2 se fait plus simplement avec
(bin & 1) //ET binaire
et "a*pow(2, cp)" peut être remplacé par (a << cp); décallage de cp bits
vers la gauche (cp multiplications par 2)
C'est plus efficace que ces deux opérations qui sont monstrueuses en
terme de calcul...


--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
PHAM Minh Quang
pow(..) a-t-elle été déclarée ?
Avatar
Michel Michaud
"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...

Mauvaise idée donc.

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...

C'est plus efficace que ces deux opérations qui sont monstrueuses en
terme de calcul...


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).

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

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


Parceque tu n'as pas le droit de faire un % sur un double...
Utilise des long à la place... Ou une convertion (long)bin % 2

Ceci dit, je pense que %2 se fait plus simplement avec
(bin & 1) //ET binaire
et "a*pow(2, cp)" peut être remplacé par (a << cp); décallage de cp bits
vers la gauche (cp multiplications par 2)
C'est plus efficace que ces deux opérations qui sont monstrueuses en
terme de calcul...


ok bien recu.
il va falloir que je décripte.
merci a+


Avatar
Michel Michaud
"Christophe Schneider" a écrit dans le message de
news:3fce1a63$0$28682$
le compilateur bloque sur cette ligne : dec = dec + ((bin %


Il bloque ou bien il donne un message d'erreur ? Si c'est un
message, je me demande bien pourquoi tu n'as pas pu le comprendre.
En général, quand ça arrive et qu'on pose la question ici, on
donne le message qu'on a reçu...

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

Avatar
Christophe
ca ne parait pas necessaire, puisque je me sert un peu de pow() sans jamais
déclarer.
merci a+


"PHAM Minh Quang" a écrit dans le message de
news:bql8mt$og8$
pow(..) a-t-elle été déclarée ?




Avatar
Christophe
C'étaient bien les doubles qui ne passaient pas.
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...???

merci
un débutant :o/


"Michel Michaud" a écrit dans le message de
news:HMpzb.10794$
"Christophe Schneider" a écrit dans le message de
news:3fce1a63$0$28682$
le compilateur bloque sur cette ligne : dec = dec + ((bin %


Il bloque ou bien il donne un message d'erreur ? Si c'est un
message, je me demande bien pourquoi tu n'as pas pu le comprendre.
En général, quand ça arrive et qu'on pose la question ici, on
donne le message qu'on a reçu...

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




Avatar
Fabien LE LEZ
On Wed, 3 Dec 2003 19:18:27 +0100, "Christophe"
wrote:

ca ne parait pas necessaire


Si. Toutes les fonctions doivent être déclarées en C++ (généralement
en #incluant des headers).
PS : merci de répondre à l'endroit -- cf
<http://www.giromini.org/usenet-fr/repondre.html>
--
;-)

Avatar
Benoit Rousseau
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.
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...

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...

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).

(a << b) effectue un décalage de b bits de a vers la droite. Un décalage
de 1 bit correspond à un multiplication par 2, n bits 2^n :
0010 << 2 = 1000 (!attention aux débordements)

(a >> b) correspond à un décalage de b bits de a vers la gauche
(division par une puissance de 2).

Les trois opérations % * et / étant assez gourmandes, ces altérnatives
étaient utilisées quand le temps de calcul importait.



--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Loïc Joly
Benoit Rousseau wrote:

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.
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...



Je pense que ce que voulait dire Michel, c'est que même si tu n'écris
pas un & dans le programme, le compilateur va probablement quand même
mettre un AND dans le code généré, ou faire encore autre chose plus rapide.

--
Loïc



1 2 3