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
Bonsoir, j'ai un pb en c++ avec les unsigned long.

Mon problème est le suivant :

typedef unsigned long ulong;

j'ai une fonction int ma_fct(ulong N)

comment puis-je vérifier que
1) N>=0 ? car si N<0 alors le compteur repart dans l'autre sens et donc N vaut alors 4 milliards et des poussières donc N est > 0 (hors c'est une erreur normalement)

2) N<= 4 milliards et des poussières cas sinon N reapart à 0

3) que N est bien un entier et non un double ou float ?

quand je fais assert(N>=0)

v[N] (v est un vecteur)
alors il y a pb car si N<0 alors v[N] correspond à l'indice 4 milliards donc ca sort de mon vecteur

Mon pb est réglé si je fais long N et non unsigned long N, mais dans ce cas la, N ne peut aller que jusqu'à 2 milliards...

J'espère ue j'ai été assez clairs dans mes explications.

Merci bcp

Pom

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
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
0
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
0
Utilisateur anonyme
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
0
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
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
0

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
0
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
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
0
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
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
0
Salut Canard007
j'ai fait identite(-5) pour tester au mieux mon jeu de tests de ma classe Matrice. Il se peut toujours que l'utilisateur se trompe lors d'une saisie. Voila tout.
Je regarde sur google le fonctionnement de scanf car je ne connais pas du tout cette fonction.

Merci
pom
0
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
0
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
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
0