Débordement d'entiers sans signe sur 8

Posté par Xevel le 26/6/2007 12:54:13
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... ^^

Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=18&topic_id=5237&post_id=21610