senga34
Messages postés14Date d'inscriptionvendredi 27 août 2004StatutMembreDernière intervention22 septembre 2004
-
7 sept. 2004 à 17:53
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 2019
-
22 sept. 2004 à 19:49
Bonjour !
Etant débutant dans VB, qui peut m'indiquer
comment faire pour générer le bit de parité pair ou impair , sachant que je sais convertir un nombre décimal en binaire
Je ne trouve pas les fonctions de décalages comme en "asm pic"
J'ai vu la fonction Xor qui est presente
Sur le site microsoft msdn , on trouve la fonction <<= ou >>=
mais ne fonctionne pas chez moi ( erreur de compilation ???)
Si on pouvait me faire un résumé la dessus !
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 sept. 2004 à 02:10
Private Function Parite(n As Byte) As Boolean
Dim x As Integer
Dim R As Integer
x = 128
Do
If n And x Then R = R + 1
x = x \ 2
Loop Until x = 0
Parite = R Mod 2
End Function
cs_kelly
Messages postés55Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 9 septembre 2004 7 sept. 2004 à 18:41
Un bit de parité ca peut aussi etre la parité du nombre de bits allumés (généralement ca fait peur mais ca se comprend), auquel cas il ne suffit plus de regarder l'état du bit de poids le plus faible, mais ca devient un peu plus fun a faire en vb...
(et pour les amateurs, ca fait de très jolies fractales)
senga34
Messages postés14Date d'inscriptionvendredi 27 août 2004StatutMembreDernière intervention22 septembre 2004 8 sept. 2004 à 18:23
Salut à tous !
Merci à tous ceux qui m'ont répondu .
J'examine tout cela et vous tiens au courant
A noter tout de meme qu'un bit de parité se calcule de la
façon suivante
exemple : si nb binaire = 1001 1000
POur générer un bit de parité paire , il faut compter le nb
de bits à 1 si le nb de bits à 1 ( ici 10011000 donc à 3)est pair alors le bit de parité = 0
sinon bit de parité = 1
Dans l'exemple mon bit de parité calculé sera donc à 1
J'avais déjà essayé avec les masques et la division /2
mais sans résultat ( on ne peux diviser un nb binaire /2
sauf erreur de ma part)
J'essaye ce que vous me conseillez de faire
et vous tiens au courant
cs_kelly
Messages postés55Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 9 septembre 2004 8 sept. 2004 à 19:12
A noter que si tu fais un programme qui dois calculer intensivement des bits de partié, eh bien la fonction de Gobillot est très lente (meme si il n'est pas vraiment possible faire mieux en vb).
Cela dit, elle est parfaite pour remplir un tableau précalculé contenant le bit de parité de tous les octets possibles :
dim ByteParities(0..255) as byte
private sub InitParityTable()
dim i as byte
for i=0 to 255
ByteParities(i)=Parite(i)
next i
end sub
Cela permet de t'éviter de calculer les bits de parité à la volée à l'exéctuion de ton programme.
Il est de plus très facile d'écrire une fonction qui permet de calculer le bit de parité d'une valeur sur 16 ou 32 bits (ou autres) en utilisant toujours la petite table ByteParities(0..255).
senga34
Messages postés14Date d'inscriptionvendredi 27 août 2004StatutMembreDernière intervention22 septembre 2004 8 sept. 2004 à 20:07
Re Salut !
Nullement mon intention était de froissé quelqu'un !.......
Je voulais simplement faire un p'tit rappel sur la fonction
et comme je ne connais pas encore toutes les fonctions
dispo en VB pour "traiter" les bits , j'avais des doutes perso
sur la comprehension de vos routines
Je rappelle que je débute en VB meme si je prgm en asm PIC
ben !ya le langage vb à apprendre
Bon j'essaye cela et vous tiens au courant !
Tiens une autre question pendant que j'y suis
Comment faire pour forcer un affichage d'un mot binaire
de la façon suivante
Actuellement si mon mot binaire est : 0001 1001
j'affiche uniquement 1 1001
Les bits de gauche à "0" ne sont pas affichés
Si mon mot est 0000 0001 j'affiche seulemnt 1
Je dois impérativement affiché 8 bits que ce soit 1 ou 0
-------------------
Je travaille actuellement sur mon 1er project , simulation du
protocole DCF77 ( horloge atomique)
Je récupére les dates et heures du pc , transforme en binaire
+
rajout du calcul de la parité paire et enfin envoie sur rs232 afin de piloter un module à base de pic 16f876
En reception un 0 comporte un pulse de 100ms tandis qu'un 1
c'est 200ms si je me rappelle bien , ou un truc dans ce gout
Voilà c'est juste pour information
cs_kelly
Messages postés55Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 9 septembre 2004 8 sept. 2004 à 21:45
pour varier les plaisirs, voici une toute autre méthode:
Private Function byte2strbin(n As Byte) As String
Dim stroct As String
Dim strbin As String
stroct = Oct(n)
While Len(s) < 3: s = "0" & s: Wend
Dim i As Byte
For i = 1 To 3
Select Case Mid(stroct, i, 1)
Case "0": strbin = strbin + "000"
Case "1": strbin = strbin + "001"
Case "2": strbin = strbin + "010"
Case "3": strbin = strbin + "011"
Case "4": strbin = strbin + "100"
Case "5": strbin = strbin + "101"
Case "6": strbin = strbin + "110"
Case "7": strbin = strbin + "111"
End Select
Next i
byte2strbin = Right(strbin, 8)
End Function
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 sept. 2004 à 22:09
Octal ou Hexa ?
Private Function Byte2String(n As Byte) As String
Dim stroct As String
Dim strbin As String
Dim i As Byte
stroct = Hex$(n)
While Len(stroct) < 2: stroct = "0" & stroct: Wend
For i = 1 To 2
Select Case Mid$(stroct, i, 1)
Case "0": strbin = strbin + "0000"
Case "1": strbin = strbin + "0001"
Case "2": strbin = strbin + "0010"
Case "3": strbin = strbin + "0011"
Case "4": strbin = strbin + "0100"
Case "5": strbin = strbin + "0101"
Case "6": strbin = strbin + "0110"
Case "7": strbin = strbin + "0111"
Case "8": strbin = strbin + "1000"
Case "9": strbin = strbin + "1001"
Case "A": strbin = strbin + "1010"
Case "B": strbin = strbin + "1011"
Case "C": strbin = strbin + "1100"
Case "D": strbin = strbin + "1101"
Case "E": strbin = strbin + "1110"
Case "F": strbin = strbin + "1111"
End Select
Next i
Byte2String = strbin
End Function
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 sept. 2004 à 22:28
Ou en modifiant quelque peu la première malgré qu'elle soit très très lente:
Private Function Byte2String(n As Byte) As String
Dim x As Integer
Dim R As String
x = 128
Do If (n And x) Then R R + "1" Else R R + "0"
x = x \ 2
Loop Until x = 0
Byte2String = R
End Function
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 sept. 2004 à 22:44
Plus classique:
Private Function Byte2String(n As Byte) As String
Dim i As Integer
Dim temp As Byte
Dim Reste As String
For i = 1 To 8
temp = n \ 2
Reste = n - 2 * temp
n = temp
Byte2String = Reste & Byte2String
Next i
End Function
cs_kelly
Messages postés55Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 9 septembre 2004 8 sept. 2004 à 23:01
elle est pas mal, mais essaye de faire mieux que ca :
Private Function byte2string(n As Byte) As String
Dim mask As Byte
Dim merde As Double
Dim res As String * 8
res = String(8, &H30)
Debug.Print "---------- engaging conversion ----------"
While n > 0
merde = Int(4# * (Sin(Exp(Exp(Rnd))) + 1#))
mask = CByte(2# ^ merde)
If (n And mask) > 0 Then
Debug.Print merde, n, mask, n And mask,
Debug.Print Not mask, n And (Not mask)
n = n And (Not mask)
Mid(res, 8 - CByte(merde), 1) = Chr(&H31)
Else
Debug.Print merde, n, mask, n And mask,
Debug.Print "(no bit detected)"
End If
DoEvents
Wend
Debug.Print vbCrLf & "Result : " & res
Debug.Print "---------- conversion succesful ----------"
byte2string = res
End Function
(bien sur il faut jeter un coup d'oeil au panneau debug à l'exécution en l'agrandissant a fond pour comprendre l'ampleur du travail effectué)
senga34
Messages postés14Date d'inscriptionvendredi 27 août 2004StatutMembreDernière intervention22 septembre 2004 9 sept. 2004 à 20:37
Salut à tous !
Je vois avec grand plaisir que vous vous êtes éclatés comme des fous!...
Tant mieux !Tant mieux !
Par contre , les gars , moi, je suis complétement largué
J'étudie le vb depuis 3 semaines seulement , alors vous comprendrez mon état......
J'ai integrer la routine de
Posté par : Gobillot
le 08/09/2004 02:10:55
Private Function Parite(n As Byte) As Boolean
Dim x As Integer
Dim R As Integer
x = 128
Do
If n And x Then R = R + 1
x = x \ 2
Loop Until x = 0
Parite = R Mod 2
End Function
Ceci fonctionne tres bien ! Merci à lui
Mais j'en ai bavé un peu parce que je m'obstinais à ce que la variable "n" prenne une valeur binaire
alors qu'en fait, il suffit de lui faire prendre la valeur décimale correspondante
Par contre, vous m'avez pas dit comment faire pour forcer un affichage sur 6 bits
si les minutes sont à 1 donc binaire = 1 alors je n'affiche que la valeur 1
Je dois afficher "000001"
Dim n As Byte
n = (Minute(Time)) ' soit Label6.Caption qui l'affiche en binaire
If Paritee(n) = True Then Label11.Caption 1 'bit de parité 1
Else Label11.Caption 0 'bit de parité 0
End If
Ben voilà pour la parité
Pour comprendre la fonction, x 128 > pour masque x= 1000 0000
If n And x Then R = R + 1
n prend ma valeur en binaire ,donc R ne sera incrémenté que si le résultat de n and x =1Parité R mod 2 > Reste mod 2
J'ai essayé la 2eme fonction mais cette fois en passant la date compléte
Private Function Byte2String(n As Byte) As String
Dim i As Integer
Dim temp As Byte
Dim Reste As String
For i = 1 To 8
temp = n \ 2
Reste = n - 2 * temp
n = temp
Byte2String = Reste & Byte2String
Next i
End Function
en modifiant "n as byte" par "n as variant"
n = (Day(Date) & (Weekday(Date)) & Month(Date) & Year(Date)) soit n= 9592004 alors renvoie 11000100
si j'effectue la division /2 de 9592004 8 fois je trouve bien les restes 11000100
Encore faudrait-il traiter ce résultat , ben oui mais comment ? ......compter le nb de bit à 1
si pair > parité =0 sinon = 1
Et encore une autre question si vous le permettez !
----------------------------------------------------
Voilà le truc
Comme vous avez compris j'utilise les fonctions "Date" et "Time"
Seulement voilà dans le protocole dcf que je veux simuler , je dois inverser les bits
exemple minutes en décimale = 58 soit en binaire 111010
J'inverse les bits , cela donne 010111
Pour inverser les bits j'utilise une fonction que j'ai récupéré sur le site vbfrance (mais je sais plus de qui !)
dans le prgm principal
***********************
'-----------Conversion decimale binaire
Dim variable As String '
variable =DecimalToBinary(Minute(Time),9)
'conversion "decimale binaire" de minute
' -----------inverse les bits------
Dim tmp As String
Inverse (variable)
La routine INVERSE
*******************
Public Function Inverse(variable As String)
'-------------------------------------------
Dim i As Variant
Dim tmp As String
Dim image As String
For i = Len(variable) To 1 Step -1
tmp = tmp & Mid(variable, i, 1) 'Mid=Renvoie un nombre spécifié de caractères à partir d'une chaîne
Next i
image = tmp
'Inverse = tmp
Label6.Caption = image
End Function
Dans cet exemple on voit LAbel6.caption
Si maintenant j'ai plusieurs fenetres "Label" à traiter de la meme façon , et c'est mon cas ,
je voudrais pouvoir passé "label x" en parametre afin d'affecté le résultat à la fenetre en question
Ne sais comment modifier ma routine "Public Function Inverse"
Suis je assez claire
De plus si je place "Label6.Caption = image" en dehors de la routine , image est traduit en décimal et non plus en binaire
Pourquoi?
C'est quoi la différence entre "Private sub" et "private function" .On ne rit pas svp
Je vois que vous utilisez tous ce genre de truc et ne trouve pas la signification de "private function"
J'arrete là , bien que j'ai des tonnes de question
Bonne soirée
@+
cs_kelly
Messages postés55Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 9 septembre 2004 9 sept. 2004 à 21:14
Je n'ai pas bcp le tmp alors je répondrai (comme je pourrai) à ta derniere question :
Une function est un sous-programme qui prend des paramètres et renvoie une valeur.
Une sub est un un cas particulier de function, au sens ou elle ne renvoie pas de valeur.
En VB, la déclaration d'une sub est la suivante :
private|public sub NomDeLaSub (nom_param_1 as type_1, ... , nom_param_n as type_n)
.........................
.........................
.........................
end sub
ou fonction se déclare de la meme facon mais en précisant le type de la valeur de retour (en gras). De plus, la fonction renvoie la valeur affectée à une pseudo-variable portant son propre nom (cf avt derniere ligne) :
private|public function NomDeLaFunc (nom_param_1 as type_1, ... , nom_param_n as type_n) as type_retour
.........................
.........................
.........................
NomDeLaFunc = valeur_de_retour
end sub
Quant aux conventions d'appel en vb, les voilà :
ceci permet d'appeler la sub :
NomDeLaSub param_1, ... , param_n
ceci permet d'appeler la fonction en ignorant la valeur de retour :
NomDeLaFunc param_1, ... , param_n
ceci permet d'appeler la fonction en utilisant la veleur de retour (ici dans une affectation) :
dim variable_resultat as type_retour
variable_resultat = NomDeLaFunc(param_1, ... , param_n)
J'espère avoir été compréhensible. Bonne chance en VB !
PS: pour les manipulation intensives de valeurs binaires (travail sur les bits) comme tu le fais, VB n'est pas vraiment une bonne idée...
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 9 sept. 2004 à 21:45
Oulala beaucoup de questions !
Ma fonction parité ne marche pour l'instant que pour 8 bits.
pour 6 bits if suffit de changer le masque de début: x=32
128 représente le poids du bit 7 égal à 2^7
pour un octet les bits sont numérotés de 7 à 0 de la gauche vers la droite.
pour rappel quand je fais (n and x) le résultat ne peut être que 0 (le bit est à zéro) ou x (le bit est à un) et non pas à 1 sauf si x est à 1, on ne traite qu'un bit à la fois.
pour 16 bits, il faut mettre en paramètres (n as integer)
et pour le masque, j'aurais 2^15 ce qui fait 32768
impossible en intéger!!! il faut passer en long: dim x as Long.
La routine parité est donc adaptable.
idem pour Byte2String, il suffit de modifié la boucle For:
For i = 1 to NombredeBitsSouhaités
seulement il faut changer aussi le type en entrée:
(n As Integer) pour 16 bits
(n As Long) pour 32 bits
et aussi Dim temp as Long
j'aime pas trop le type Variant
Problème aussi pour les nombres négatifs.
La fonction inversion est inutile. on peut avoir le résultat directement en inversant:
Byte2String = Reste & Byte2String
par
Byte2String = Byte2String & Reste
Pour passer un Label en paramètre:
Private Sub Command1_Click()
Modifcaption Label1
End Sub
Private Sub Modifcaption(obj As Label)
obj.Caption = "blablabla"
End Sub
je te cite:
De plus si je place "Label6.Caption = image" en dehors de la routine , image est traduit en décimal et non plus en binaire
Pourquoi?
Label6.Caption est en texte, donc quel que soit le type de image, Vb va le convertir en chaîne
même si tu fais hex$(image) c'est encore une chaîne.
et encore Label6 = Clng(image)
bin$ ça n'existe pas.
La différence entre une Sub et une Fonction:
Kelly a déja répondu à la question.