Mot non signé [Résolu]

cs_nabulio54 13 Messages postés samedi 5 août 2006Date d'inscription 6 décembre 2008 Dernière intervention - 5 août 2006 à 10:58 - Dernière réponse : cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention
- 7 août 2006 à 10:01
Je débute avec VB6. J'ai plutôt tendance à programmer en Delphi.
Question bête: Comment fait on pour déclarer une variable en 16 bits non signés (integer en VB étant 16 bits signés). Je n'arrive pas à trouver dans l'aide.
Autre question: Quel sont les fonctions en VB pour faire des décalage de bits à gauche ou à droite ( l' équivalent de SHL ou SHR en delphi je crois).
Merci à celui qui répond
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 5 août 2006 à 11:14
3
Merci
Dsl, ne bataille pas plus longtemps, les nombres non signés n'existent tout simplement pas en VB6

En VB6, il n'y a pas non plus de fonctions de décalage de bits tout simplement parce que VB ne sait pas travailler avec les bits.

Seule méthode :
- Pour un décalage vers la gauche de x bits : multiplication par 2^x
- Pour un décalage vers la droite de x bits : division par 2^x

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 5 août 2006 à 17:27
3
Merci
Bon alors je vais essayé de répondre dans l'ordre, sans trop me perdre.
"une variable que l'on envoie sur un port". Peut importe de la variable, il s'agit d'une donnée que l'on transmet à un périphérique externe via un port en l'occurence ici série (ou RS232) met ça aurait pu etre USB, FireWire, RS422, PcMcia,.........

Dans le cas présent, le port série RS232 n'accepte que des données de type octet (char) ou suite d'octets (string), les données sont transmises octet par octet. Donc Nabulio avec son mot, il ne peut pas l'envoyer directement, il est obligé de le découper en 2 octets pour transmettre ensuite chaque octet l'un après l'autre sous forme de caractère.

Pourquoi 50000 tout simplement parce que Nabulio donne ce chiffre dans sa réponse, et qu'en plus il est bien significatif du problème des nombres signés en VB.

Un mot signé (donc 16 bits signé) à pour plage de variation -32768 / 32767 (valeur représentée sur 15 bits)
Un mot non signé (donc 16 bits non signé) a pour plage de variation 0 / 65535 (valeur représentée sur 16 bits)

Donc 50000 peut etre réprésenté par un mot non signé (en C par exemple), mais ne rentre pas dans un mot signé comme en VB. Dans ce cas il faut passer sur un double mot.

Donc si tu veux travailler avec du "non signé" en VB, à partir du moment ou tu peux dépasser la moitié de la plage  "non signé", tu es obligé de prendre le type de variable suppérieur pour faire rentrer le nombre.

J'espère t'avoir éclairé un peu plus.

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de cs_casy
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 5 août 2006 à 11:00
0
Merci
Salut,

peut-être que la réponse de Econs peut te satisfaire concernant les bits :

http://www.vbfrance.com/infomsg_DECALAGE-BIT_791187.aspx#2

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
Commenter la réponse de mortalino
cs_nabulio54 13 Messages postés samedi 5 août 2006Date d'inscription 6 décembre 2008 Dernière intervention - 5 août 2006 à 11:22
0
Merci
Merci pour les explications . Mais cela ne résout pas mon problème: Je dois envoyer sur un port série un mot de 16 bits qui peut avoir pour valeur décimal 50 000. Et je ne vois pas comment je peut faire.
Commenter la réponse de cs_nabulio54
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 5 août 2006 à 11:34
0
Merci
Déjà sur le port série tu ne peut envoyer que des octets soit 8 bits. Il faut donc que tu découpe ton mot en 2 octets pour pouvoir l'envoyer.

' Octet poid fort =  Décalage de 8 bits vers la droite + masque sur le poid faible

Octet1 = (TonMot / 256) 
AND &H0FF 

' Octet poid faible = Masque sur le poid faible du mot

Octet2 = TonMot 
AND &H0FF 

' Envoi des octets

Mscomm.Output = chr$( Octet1) & chr$(Octet2)

Sevyc64  (alias Casy) <hr align ="center" size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 5 août 2006 à 16:26
0
Merci
C'est pas faux !!

Humm au risque de passer pour un blaireau, c'est quoi tout ça !!
Envoyer un mot ? Ou ça ? Dans quel but ?

Désolé, mais je n'y connais rien en comm / port donc ça me ferait plaisir si qqun pouvait m'expliquer ces 'interrogations' !
Merci

(ps : " Octet1 = (TonMot / 256) 
AND &H0FF", Octet1 doit -être déclarer en quoi pour accepter ce genre de valeur ?)

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
Commenter la réponse de mortalino
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 5 août 2006 à 16:45
0
Merci
C'est quoi que tu pige pas mortalino ?

Octet1 et Octet2 peuvent etre déclaré en Byte (octet) même si souvent je les déclare en integer (mot en vb6). Cela n'a finalement que peu d'importance en VB6, il est tellement permissif.

TonMot sera obligatoirement au minimum un integer (ou short) et indiquera un nombre négatif pour les valeurs supérieures à &h7FFF (32767). Donc un integer n'acceptera jamais 50000 mais plutot -17232. Mais 50000 non signé et -17232 signé ont le même code hexa.
C'est pas clair mais en gros un mot non signé égal à 50000 en C s'il est passé en VB il deviendra signé et sera égal à -17232.

Sinon pour accepter 50000 TonMot doit etre déclarer en long (double mot soit 32 bits)

J'avais oublier de préciser que le 256 viens de 2^8 soit un décalage de 8 bits.

Question com je commence à avoir quelques années de galère dans ce domaine

Sevyc64  (alias Casy)
<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 5 août 2006 à 16:58
0
Merci
Ok merci, tes explications sont clairs. ils me reste 2 interrogations :

Pourquoi dans "TonMot", tu y place un nombre ? C'est quoi 50 000 ?(ou du moins, ça correspond à quoi)
J'ai bien compris le truc du Integer et du Long, mais qu'elle est la différence entre une variable (VB) signée & une variable (que l'on doit envoyer dans un port) non signée ?

Sinon, j'ai également bien compris le coup de la division par 256.

Merci Casy 

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
Commenter la réponse de mortalino
cs_nabulio54 13 Messages postés samedi 5 août 2006Date d'inscription 6 décembre 2008 Dernière intervention - 5 août 2006 à 17:56
0
Merci
Merci pour toutes ces explications
Commenter la réponse de cs_nabulio54
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 6 août 2006 à 11:12
0
Merci
Salut Casy,

c'est parfait, je pense que l'on ne pouvait faire plus explicite.

Je te remercie beaucoup. ;)

++
mortalino
Commenter la réponse de mortalino
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 6 août 2006 à 17:51
0
Merci
Salut, l'explication de Casy est effectivement parfaite mais je vais remettre une couche pour ceux qui se sentent mal à l'aise avec le terme "mot" :

"mot" est la traduction française de "word" (jusque là n'importe quel dictionnaire le dira) qui désigne, en informatique, un type de donnée de 16 bits (2 octets) soit un integer en vb6.
De même "double-mot" = "dword" qui désigne un type de donnée de 32 bits (4 octets) soit un long en vb6 (voire un single ou un object mais dans ces cas le codage est différent).

Les aléas des traductions françaises du jargon informatique américain. Traduire "word" par mot, pourquoi pas ? C'est logique mais dans ce cas pourquoi ne pas traduire "bug" par "punaise" au lieu de "bogue" ?

HiHi, c'était juste une apparté, bonne prog à tous !
Commenter la réponse de Dolphin Boy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 6 août 2006 à 21:02
0
Merci
Merci Dolphin.

Et je vais rajouter une chose que je n'ai pas dit jusqu'à maintenant.

Le terme integer (ou int en C) devrait être  banni de tout langage informatique. C'est ce que l'on appelle un faux ami
Suivant les machines, les OS et les langages,  une variable integer n'a pas la même taille. Elle peut faire 8, 16, 32 ou 64 bits.
Elle fera 16 bits sur un système Windows 32 bits sous VB6 mais 32bits sous VC6.
En C sous système 16 bits (Windows 3.1) elle fesait 16 bits. Sur un système 64 bits en C elle devrait normalement faire 64 bits.
Le terme integer devrai être banni au privilège des termes exact qui sont Short (ou Word) et Long (ou DWord).
Et attention avec . NET, la taille des variables a completement changée alors que les termes ont été conservés, histoire d'ajouter à la confusion.

Et Dolphin (et les autres) connais-tu l'origine du terme "bug" en informatique ? C'est une belle anecdote, je trouve.

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy
cs_nabulio54 13 Messages postés samedi 5 août 2006Date d'inscription 6 décembre 2008 Dernière intervention - 7 août 2006 à 09:37
0
Merci
L'origine du terme"bug"?


Mon prof d'informatique me l'avait expliqué un jour. Que je me rappelle....


Au début de l'informatique( fin 40, début 50), les ordinateur fonctionnaient avec des lampes,commutateurs,etc... 


Un jour, dans un centre de recherche américain, une panne d'un de ces ordinateurs a été provoqué par une sale bête. En effet,un cafard(bug en anglais) logé dans un contact(ou quelque chose comme ça) empêchat un liaison électrique de s'établir. Le technicien qui a trouvé l'origine de la panne a rédigé un très célébre rapport ou il a noté dans la case "origine de la panne: BUG". Et depuis c'est devenu le responsable de tous les malheurs de tous les informaticiens de la planéte. J'ai souvenir que mon prof avait fait circuler une copie de ce fameux rapport. Si je le retrouve, je vous ne manquerai pas de vous le faire parvenir.
Voilà, j'espère ne pas mettre trop planté!
Commenter la réponse de cs_nabulio54
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 7 août 2006 à 10:01
0
Merci
Bravo nabulio, une vrai encyclopédie.
Tu as réussi ton examen, tu as droit à ton diplome

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.