Débordement d'entiers sans signe sur 8
Stagiaire WDF
Inscrit:
26/06/2007 12:00
Post(s): 3
Bonjour,

Je débute en Windev, et je dois réaliser un bout de code permettant de créer un identifiant à partir de certaines données. Cet identifiant fait 64 bits, chaque bit ou groupe de bits (de différentes longueurs) a sa propre signification.

J'ai donc opté pour un entier sans signe sur 8 pour construire mon identifiant, et je procède en ajoutant la valeur du champs puis en décalant a gauche d'autant de bits que nécessaire, et je réitère.

Ex bidon :
Pour obtenir 100101 (binaire), qui représente (en partant de la gauche) 2 bits pour le numero de version, 1 bit pour le type et 3 bits pour l'identifiant, je fais :

version est un entier = 2
type est un entier = 0
id est un entier = 5

x = version
x = decalage_gauche(x,1) + type
x = decalage_gauche(x,3) + id

La fonction decalage_gauche(x,n) prends x, le multiplie n fois par 2 et renvoi le resultat.

Problème :
pour mon identifiant 64bits, tout se passe bien jusqu'a la derniere etape, lorsque je fais le dernier décalage et que j'ajoute le nombre qui donnera les bits de poids faible.
Le décalage se passe sans problèmes mais apres je ne peux plus ajouter au resultat quoi que ce soit, sous peine de l'erreur suivante :


Erreur à la ligne 39 du traitement Procédure globale commande_intermediaire.
Un élément de type vide ne peut pas être converti vers le type entier sans signe sur 8 octets.

Informations techniques

Projet : ComHitagS_test

Dump de l'erreur du module <WD110VM.DLL> <11.00Qa>.

- Appel WL :
Traitement de <Procedures globales de ComHitagS_test.commande_intermediaire>, ligne <39>, thread <0>

- Niveau : erreur fatale (EL_FATAL)

- Code erreur : 1021

- Code erreur WD55 : 0

- Pas de code d'erreur système

- Pas de message d'erreur système

- Que s'est-il passé ?
Un élément de type vide ne peut pas être converti vers le type entier sans signe sur 8 octets.

- Pas d'info de debug

- Infos attachées :
EIT_DATEHEURE : 26/06/2007 12:41:33
EIT_PILEWL :
Procédure globale commande_intermediaire (Procedures globales de ComHitagS_test.commande_intermediaire), ligne 39
Clic sur BTN_calculer (FEN_Front.BTN_calculer), ligne 16

- Identifiant dans le .err : 1021



et voici la procédure en question :

PROCEDURE commande_intermediaire(bAnimal,bEtendu,nPays,nNumero est un entier sans signe sur 8,nRemplacement,nInfos_utilisateur)
	nRes est un entier sans signe sur 8
	
	tmp est un entier sans signe sur 8 = nNumero

	nBlocDonnées est un entier
	SI bEtendu ALORS nBlocDonnées = 1
	
	Trace ("init "+ nRes)
	SI bAnimal ALORS nRes = 1
	nRes = Décalage_gauche(nRes, 3) + nRemplacement
	nRes = Décalage_gauche(nRes, 11) + nInfos_utilisateur
	nRes = Décalage_gauche(nRes, 1) + nBlocDonnées
	nRes = Décalage_gauche(nRes, 10) + nPays
	nRes = Décalage_gauche(nRes, 38) + nNumero  // ***LIGNE 39***
        //tmp = nRes + 1
	//tmp = 10376294061217436672 + 1
	Trace (tmp, nRes)
RENVOYER nRes


A noter : la ligne suivant celle posant problème dans l'exemple fait la même erreur : ajouter 1 ou enlever 1 a nRes n'est plus possible...
la seconde ligne commentée fait exactement le calcul que la ligne 39 tente de faire (pour des valeurs données des paramètres), mais ne pose pas de problème...
Les valeurs des paramètres ne dépassent pas les valeurs admissibles (par exemple nRemplacement ne pourra jamais dépasser 7, donc n'occupera jamais plus de 3 bits.


Je commence à me demander si WinDev ne fait pas les évaluations des membres droit des affectations obligatoirement dans un entier signé... :/

Voila si vous avez lu jusqu'ici, merci et j'espère que vous pourrez m'aider... ^^

Contribution le : 26/06/2007 12:54
Créer un fichier PDF de la contribution Imprimer


Re: Débordement d'entiers sans signe sur 8
Utilisateur WDF
Inscrit:
20/06/2006 14:56
Post(s): 57
Bonjour,

Il faut faire attention que les décalages + la taille des éléments ne dépasse pas 64 bits car dans ton exemple il y a de fortes chances pour que cela se produise.

ici:
nRemplacement<8
nInfos_utilisateur< 2048
nBlocDonnées<2
nPays<1024
nNumero<274877906944

Contribution le : 26/06/2007 13:23

Edité par ronaldo1 sur 26/6/2007 13:39:41
Créer un fichier PDF de la contribution Imprimer


Re: Débordement d'entiers sans signe sur 8
Stagiaire WDF
Inscrit:
26/06/2007 12:00
Post(s): 3
Merci pour ta réponse ^^

Ces verifications sont effectuées en amont, au niveau de l'IHM. Il n'y a donc pas de risques de ce coté là.
De plus, en faisant le test en ajoutant 1 au resultat du décalage (test qui renvoi la même erreur), on s'appercoit que le problème viens d'ailleurs.

J'ai finalement réussi à résoudre le problème :

PROCEDURE commande_intermediaire(bAnimal,bEtendu,nPays,nNumero est un entier sur 8,nRemplacement,nInfos_utilisateur)
	nRes est un entier sans signe sur 8
	
	nTmp est un entier sans signe sur 8 = nNumero

	nBlocDonnées est un entier
	SI bEtendu ALORS nBlocDonnées = 1
	
	nRes = nRemplacement
	nRes = Décalage_gauche(nRes, 11) + nInfos_utilisateur
	nRes = Décalage_gauche(nRes, 1) + nBlocDonnées
	nRes = Décalage_gauche(nRes, 10) + nPays
	nRes = Décalage_gauche(nRes, 38) + nNumero
	Trace (nRes)
	SI bAnimal ALORS nRes = nRes + LIMITE_MAX_ENTIER_8+1 // voila le super trick ^^
	
RENVOYER nRes


Le truc consiste à bidouiller avec une constante numérique. Je me suis appercu du fait que le problème arrive quand Windev fait une évaluation avec une variable x telle que MAX_ENTIER_8 < x <= MAX_ENTIER_SANS_SIGNE_8 (limites données dans "Limites.wl", que j'ai inclu dans mon projet). La fainte consiste alors à faire en sorte que ma variable soit inferieure à MAX_ENTIER, et que ce soit ce que j'y ajoute qui soit une constante aussi grande que je veux. Donc là, pour remplacer le 1 que je mettai au debut et qui était décalé de 63 positions en tout (pour devenir le MSBit), j'ajoute la constante égale à 2^64... et là ca marche ^^
Il est à noter que j'ai essayé avec avec Puissance(2,63) et que ca n'a pas marché... le résultat n'est cohérent que jusqu'a 2^31 ou 2^32, donc la c'était rapé :/

Voila ^^

Contribution le : 26/06/2007 14:56
Créer un fichier PDF de la contribution Imprimer


Re: Débordement d'entiers sans signe sur 8
Utilisateur WDF
Inscrit:
20/06/2006 14:56
Post(s): 57
J’ai l’impression en t’écoutant que cela vient de la fonction renvoyer de ta fonction qui envoie un entier qui n’est pas "sans signe sur 8 octets". Dans ce cas la dans ta fonction utilise le "x" (nres) et donne lui dans cette fonction la valeur final ainsi le "nRes" sera mise à jour en faisant
procedure Décalage_gauche(x,n)
x= x*puissance(2,n)

 Décalage_gauche(nRes, 11) ; nRes+= nInfos_utilisateur

Contribution le : 26/06/2007 21:30
Créer un fichier PDF de la contribution Imprimer


Re: Débordement d'entiers sans signe sur 8
Stagiaire WDF
Inscrit:
26/06/2007 12:00
Post(s): 3
Je viens de faire l'essai en modifiant x dans ma fonction decalage_gauche : le resultat est le même. Une fois le décalage effectué (avec succès), essayer de lui ajouter quoi que ce soit provoque la même erreur.

Contribution le : 27/06/2007 08:56
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2