Problème avec une fonction

Résolu
mvgeek Messages postés 1252 Date d'inscription   Statut Contributeur sécurité Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Membre Dernière intervention   149
 
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   Statut Contributeur sécurité Dernière intervention   107
 
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   Statut Contributeur sécurité Dernière intervention   107
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur sécurité Dernière intervention   107
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur sécurité Dernière intervention   107
 
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   Statut Membre Dernière intervention   149
 
ça doit même être faisable en tableau de chaînes de caractères...
0
mvgeek Messages postés 1252 Date d'inscription   Statut Contributeur sécurité Dernière intervention   107
 
@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