Problème avec une fonction

Résolu/Fermé
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 - 21 févr. 2011 à 22:10
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 févr. 2011 à 21:52
Bonjour,
j'ai essayé de coder un programme, permettant, à partir d'un nombre entré, de calculer celui-ci en le multipliant par 2, 64 fois. En fait, je cherche à déterminer le nombre final si on doublait un nombre sur chaque case d'un échiquier (d'où les 64 fois) :

#include <stdio.h>
#include <stdlib.h>

long echiquier(long resultat)
{
int incrementateur = 0;
while(incrementateur < 64)
{
resultat = resultat * 2;
incrementateur = incrementateur + 1;
}
return resultat;
}

int main()
{
long resultat;
printf("Veuillez insérer le nombre de départ :");
scanf("%d", &resultat);
resultat = echiquier(resultat);
printf("Le résulat est : %d", &resultat);

return 0;
}

J'avoue que j'ai minimalisé au maximum (la variable "resultat" étant réutilisé. Or, le nombre final est un nombre négatif. S'agit-il d'un débordement de variable ou d'une erreur de programmation ?

Cordialement.



3 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
21 févr. 2011 à 23:10
Bonsoir,

La réponse est dans ta question...
Sur combien de bits est stocké "resultat" ? --> entier long 32 bits !

Essaie avec long double...
cf. https://www.commentcamarche.net/contents/196-langage-c-les-types-de-donnees

++
1
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 107
21 févr. 2011 à 23:19
Salut et merci pour ta réponse. J'ai essayé avec ce code :

#include <stdio.h>
#include <stdlib.h>

long double echiquier(long double nombreEntre)
{
int incrementateur = 0;
long double resultat = 0;
while(incrementateur < 64)
{
resultat = nombreEntre * 2;
incrementateur++;
}
}

int main()
{
long double nombreEntre = 0;
printf("Veuillez insérer le nombre de départ :");
scanf("%d", &nombreEntre);
printf("Le résultat est : %d", echiquier(nombreEntre));

return 0;
}

Mais finalement, le printf me retourne 0 ! Apparemment, le calcul a été abandonné à un moment...
0
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 107
21 févr. 2011 à 23:30
Oups, je n'étais pas bien réveillé, voici le code-source corrigé :

#include <stdio.h>
#include <stdlib.h>

long double echiquier(long double nombreEntre)
{
return nombreEntre * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2;
}

int main()
{
long double nombreEntre = 0;
printf("Veuillez insérer le nombre de départ :");
scanf("%d", &nombreEntre);
printf("Le résultat est : %d", echiquier(nombreEntre));

return 0;
}

Mais le printf renvoie toujours 0...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 21/02/2011 à 23:48
Bonjour,

L'erreur principal est : printf("Le résulat est : %d", &resultat);

Tu affiches l'adresse et non la valeur : printf("...%d",resultat);

Ensuite attention pour ta variable, elle sera trop petite. Et tu peux pas utiliser les flottants (double, ...) car tu travailles en entier.

En C99, tu as le type long long qui est de 64 bits.
Mais tu seras bloqué pour la prochaine itération. Dans ce cas, à toi de gérer la multiplication, ou plus simplement tu peux utiliser une bibliothèque BIGNUM pour gérer les grands nombres (openssl par exemple).

Cdlt,

Google is your friend
0
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 107
21 févr. 2011 à 23:43
Salut : tu veux dire que la ligne correcte serait :

printf("Le résultat est : %", echiquier(nombreEntre)); ?!

Mon code complet est donc :

#include <stdio.h>
#include <stdlib.h>

long long echiquier(long long nombreEntre)
{
return nombreEntre * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2;
}

int main()
{
long long nombreEntre = 0;
printf("Veuillez insérer le nombre de départ :");
scanf("%d", &nombreEntre);
printf("Le résultat est : %d", echiquier(nombreEntre));

return 0;
}

Mais ça affiche toujours 0 :'(
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 22/02/2011 à 00:00
printf("Le résultat est : %", echiquier(nombreEntre)); ?
Non non, %d. Ce que je voulais dire, c'est qu'il ne faut pas mettre l'esperluette devant la variable (&).
Si tu utilises long long, alors il ne faut pas mettre %d mais %ll (L minuscule) dans tes printf et scanf.
Tu peux même utiliser unsigned long long pour ta variable. Dans ce cas, il faudra mettre : %llu.
Mais, ça devrait afficher 0. Car la valeur maximale que tu pourras afficher avec ceci est (2 puissance 64) - 1. Donc, utilise plutôt la bibliothèque openssl pour le type BIGNUM.

Cdlt,
0
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 107
22 févr. 2011 à 01:28
Bon, apparemment, ça va être dur, vu la taille du nombre qui devra être stocké... Merci pour vos réponses, j'ai appris plein de nouveaux types de variables !
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
22 févr. 2011 à 19:42
ça doit même être faisable en tableau de chaînes de caractères...
0
mvgeek Messages postés 1252 Date d'inscription dimanche 12 juillet 2009 Statut Contributeur sécurité Dernière intervention 4 septembre 2011 107
22 févr. 2011 à 21:30
@Zoul67 : sauf que les principales opérations se trouvent dans la fonction, qui ne peut pas être calculée en chaînes de caractères (si ?)
0