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 -
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.
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.
A voir également:
- Problème avec une fonction
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Cette fonction n'est pas disponible actuellement tv lg - Forum Téléviseurs
3 réponses
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
++
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
++
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...
#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...
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...
#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...
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
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
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 :'(
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 :'(
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,
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,