C++ pb avec les unsigned long int
Fermé
pom
-
27 mai 2004 à 21:50
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 28 mai 2004 à 14:22
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 28 mai 2004 à 14:22
A voir également:
- C++ pb avec les unsigned long int
- Pc long a demarrer - Guide
- Traduction anglais français texte long gratuit photo - Guide
- Le mot le plus long jeu gratuit - Télécharger - Outils professionnels
- Le nom de fichier spécifié n'est pas valide ou est trop long ✓ - Forum Windows
- Chanteur cheveux long - Forum Musique / Radio / Clip
7 réponses
rucht
Messages postés
248
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
18 juillet 2008
1
28 mai 2004 à 10:12
28 mai 2004 à 10:12
c pas tres clair pour moi ton truck (mais bon c le matin donc ... ) en tout cas pour verifier si N>=0 tu peut tout simplement faire un if(N<=0)exit-1; et la t sur que ton n est positif , pour la suite g rien conpri mais si tu veut verifier tes truck je pence que if sa va bien ( ou switch si ta des valeur fixe mais sa semble pas etre ton cas )
voila en esperent t 'avoir aider
a plus rucht
voila en esperent t 'avoir aider
a plus rucht
Salut rucht, je vais te donner un exemple plus précis, pour esayer d'etre plus clair dans mes explications.
Je veux par exemple créer la matrice identité N*N(si tu n'as jamais fais de maths c'est une matrice à N lignes et N colonnes avec des 1 sur la diagonale principale et des 0 ailleurs)
Matrice identité(ulong N)
{
assert(N>0);
blabla
}
si je fais identité(-5) alors N qui valait -5 passe à 4 milliards et des poussiières donc j'ai une matirce gigantesque alors que normalement il y a une erreur.
En revanche
Matrice identite(long N) (j'ai remplace unsigned long par long)
{
assert(N>0)
blabla
}
identite(-5) plante
Ai-je été un peu plus clair dans mon pb ?
merci
Pom
Je veux par exemple créer la matrice identité N*N(si tu n'as jamais fais de maths c'est une matrice à N lignes et N colonnes avec des 1 sur la diagonale principale et des 0 ailleurs)
Matrice identité(ulong N)
{
assert(N>0);
blabla
}
si je fais identité(-5) alors N qui valait -5 passe à 4 milliards et des poussiières donc j'ai une matirce gigantesque alors que normalement il y a une erreur.
En revanche
Matrice identite(long N) (j'ai remplace unsigned long par long)
{
assert(N>0)
blabla
}
identite(-5) plante
Ai-je été un peu plus clair dans mon pb ?
merci
Pom
Utilisateur anonyme
28 mai 2004 à 10:38
28 mai 2004 à 10:38
tu peux rajouter des preconditions à ta fonction disant que le paramètre doit être > 0 dans ce cas c'est ceux qui utliseront ta fonction qui devront se soucier de passer un paramètre valide (donc test sur N effectue dans le programme appelant)
ce n'est pas une solution programmée mais je pense que c'est un bon moyen de gerer ce genre de cas
en espérant que ca peut t'aider
ce n'est pas une solution programmée mais je pense que c'est un bon moyen de gerer ce genre de cas
en espérant que ca peut t'aider
Canard007
Messages postés
5929
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
215
28 mai 2004 à 11:00
28 mai 2004 à 11:00
le unsigned te permet juste d avoir des valeur entiere plus grande:
en effet un long normal aura ses valeurs comprise entre
-2 147 483 648 (LONG_MIN) et 2 147 483 647 (LONG_MAX).
alors qu un unsigned vu qu on vire le signe aura ses valeurs comprise entre 0 et 4 294 967 295 mais cela rest un long donc si tu tape -x et bien le programme partira en arriere donc -1 = 4 294 967 295 vu qu on est unsigned..
le probleme dans ton programme est que tu ne garanti pas que le unsigned et bien unsigned donc comme il a etait dit precedement fait un petit test au moment de la saisie du N ( si ya saisie)
en faisant if(N>=0&&N<4 294 967 295) ton prog
else erreur
voila bonne journée
en effet un long normal aura ses valeurs comprise entre
-2 147 483 648 (LONG_MIN) et 2 147 483 647 (LONG_MAX).
alors qu un unsigned vu qu on vire le signe aura ses valeurs comprise entre 0 et 4 294 967 295 mais cela rest un long donc si tu tape -x et bien le programme partira en arriere donc -1 = 4 294 967 295 vu qu on est unsigned..
le probleme dans ton programme est que tu ne garanti pas que le unsigned et bien unsigned donc comme il a etait dit precedement fait un petit test au moment de la saisie du N ( si ya saisie)
en faisant if(N>=0&&N<4 294 967 295) ton prog
else erreur
voila bonne journée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut Canard007
j'avais déjà essayé ce test mais voila la réponse du compilateur :
warning: passing negative value `-5' for argument passing 1 of `Matrice identite(long unsigned int)'
warning: argument of negative value `-5' to `long unsigned int'
conclusion : il me renvoie une matrice (bizarre mais ce que je veux c'est que le prgm s'arrete)
j'avais fait : assert(N>0 && N<=4294967295);
J'avoue ne pas tout comprendre...
pom
j'avais déjà essayé ce test mais voila la réponse du compilateur :
warning: passing negative value `-5' for argument passing 1 of `Matrice identite(long unsigned int)'
warning: argument of negative value `-5' to `long unsigned int'
conclusion : il me renvoie une matrice (bizarre mais ce que je veux c'est que le prgm s'arrete)
j'avais fait : assert(N>0 && N<=4294967295);
J'avoue ne pas tout comprendre...
pom
Ravachol
Messages postés
560
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
28 mai 2004 à 12:01
28 mai 2004 à 12:01
Salut,
dans quel mode compiles tu ?
car assert ne fonctionne qu'en mode debug.
A++
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
dans quel mode compiles tu ?
car assert ne fonctionne qu'en mode debug.
A++
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
Canard007
Messages postés
5929
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
215
28 mai 2004 à 11:26
28 mai 2004 à 11:26
warning pour te prevenir que le comportement ne sera pas celui voulu puisque tu passe un argument negatif alors que tu a declaré que l argument devait etre un unsigned donc c est normal.
Ce que je te dit c est qu il faut que tu grantisse avant d appeler la matrice identité que l argument est bien un unsigned valide d ou le test if que je t ai proposé..
Sinon je ne comprend pas pourquoi tu veux faire identite(-5)
Ce -( il vient d ou c est toi qui l a codé en dur ou cela provient d une saisie de l utilisateur , dans le prmier cas cela vient d un proleme de conception de ta part vu que tu veux passer un nombre negatif alors que tu declare un unsigne fodra donc pour regler le prob faire identite (long N)
si c est le second cas lorsque tu fera ton scanf("%u",&N)
tu fera le test apres pour verifier que le nombre est bien un unsigned
Ce que je te dit c est qu il faut que tu grantisse avant d appeler la matrice identité que l argument est bien un unsigned valide d ou le test if que je t ai proposé..
Sinon je ne comprend pas pourquoi tu veux faire identite(-5)
Ce -( il vient d ou c est toi qui l a codé en dur ou cela provient d une saisie de l utilisateur , dans le prmier cas cela vient d un proleme de conception de ta part vu que tu veux passer un nombre negatif alors que tu declare un unsigne fodra donc pour regler le prob faire identite (long N)
si c est le second cas lorsque tu fera ton scanf("%u",&N)
tu fera le test apres pour verifier que le nombre est bien un unsigned
Salut, tu me poses une drole de question car je ne suis pas du tout expert en debugage de c++
tout ce que je peux te dire, c'est que j'ai mis pas mal d'assert dans mon prgm, je le compile à l'aide d'un makefile et je l'exécute. En gros je fais :
g++ matrice.cpp -Wall -Wno-deprecated -o out
J'espère avoir répondu à ta question... Je ne sais pas trop ce qu'est un mode.
Pom
tout ce que je peux te dire, c'est que j'ai mis pas mal d'assert dans mon prgm, je le compile à l'aide d'un makefile et je l'exécute. En gros je fais :
g++ matrice.cpp -Wall -Wno-deprecated -o out
J'espère avoir répondu à ta question... Je ne sais pas trop ce qu'est un mode.
Pom
Ravachol
Messages postés
560
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
28 mai 2004 à 14:22
28 mai 2004 à 14:22
Re,
si tu regardes dans l'aide ou dans le header assert.h tu trouveras un symbole NDEBUG, normalement il n'et défini nulle part c'est à toi de le faire.
Si tu l'as défini quelque part dans ton code l'instruction assert ne fera rien, comme il est dit dans l'aide.
Mais si tu as d'autre assert qui fonctionne par ailleurs dans ton prog le pb est manifestement ailleurs.
A++
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
si tu regardes dans l'aide ou dans le header assert.h tu trouveras un symbole NDEBUG, normalement il n'et défini nulle part c'est à toi de le faire.
Si tu l'as défini quelque part dans ton code l'instruction assert ne fera rien, comme il est dit dans l'aide.
Mais si tu as d'autre assert qui fonctionne par ailleurs dans ton prog le pb est manifestement ailleurs.
A++
Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS