2009-02-11 6 views

Répondre

5

Si cela ne doit pas être fait dans le même programme, il me semble qu'il serait plus facile de trouver un format commun que VB et COBOL peuvent comprendre.

Ce serait du texte. En d'autres termes, la solution la plus simple peut être d'écrire le numéro dans un fichier en tant que texte "3.14159" et que le code COBOL le lise dans ce format et MOVE dans le champ COMP-3?

Si ce n'est pas possible, le COMP-3 est un type BCD assez simple. Je convertirais le nombre en une chaîne de toute façon, puis prendre deux caractères à la fois dans un tableau d'octets.

Le S9 (15) V99 nécessite 18 quartets (un demi-octet étant de 4 bits, ou une demi-octet) pour stocker:

  • le bit de nombre entier (quinze quartets).
  • le bit fractionnaire (deux bits).
  • le signe (un nybble).

Aucun espace n'est requis pour la virgule décimale car V est une décimale implicite, et non réelle.

Ainsi, le nombre 3.14 serait représenté par les octets:

00 00 00 00 00 00 00 31 4C 

Le seul peu délicat est que nybble signe final (pour C positif et négatif pour D).

Voici un peu de code que j'ai fouetté dans Excel VBA (je n'ai malheureusement pas installé VB sur cette machine) qui vous montre comment faire. La fonction makeComp3() devrait être facilement transférée dans un vrai programme VB.

Le programme de test fournit en sortie les valeurs de macro 0, 49 et 76 qui sont HEX 00, 31 et 4C respectivement (00314C est +3.14).

La première étape (après toutes les déclarations) est de faire la double une décimale implicite en le multipliant par la puissance pertinente de dix transformer ensuite en un entier:

Option Explicit 

' makeComp3. ' 
' inp is the double to convert. ' 
' sz is the minimum final size (with sign). ' 
' frac is the number of fractional places. ' 

Function makeComp3(inp As Double, sz As Integer, frac As Integer) As String 
    Dim inpshifted As Double 
    Dim outstr As String 
    Dim outbcd As String 
    Dim i As Integer 
    Dim outval As Integer 
    Dim zero As Integer 
    zero = Asc("0") 

    ' Make implied decimal. ' 
    inpshifted = Abs(inp) 
    While frac > 0 
     inpshifted = inpshifted * 10 
     frac = frac - 1 
    Wend 
    inpshifted = Int(inpshifted) 

Ensuite, nous en faisons une chaîne de la bonne taille, pour faciliter le traitement:

' Get as string and expand to correct size. ' 
    outstr = CStr(inpshifted) 
    While Len(outstr) < sz - 1 
     outstr = "0" & outstr 
    Wend 
    If Len(outstr) Mod 2 = 0 Then 
     outstr = "0" & outstr 
    End If 

Ensuite, nous traitons cette chaîne à deux chiffres à la fois et chaque paire est combiné dans une nybble de sortie. La dernière étape consiste à traiter le dernier chiffre avec le signe:

' Process each nybble pair bar the last. ' 
    outbcd = "" 
    For i = 1 To Len(outstr) - 2 Step 2 
     outval = (Asc(Mid(outstr, i)) - zero) * 16 
     outval = outval + Asc(Mid(outstr, i + 1)) - zero 
     outbcd = outbcd & Chr(outval) 
    Next i 

    ' Process final nybble including the sign. '  
    outval = (Asc(Right(outstr, 1)) - zero) * 16 + 12 
    If inp < 0 Then 
     outval = outval + 1 
    End If 

    makeComp3 = outbcd & Chr(outval) 
End Function 

Et ceci est juste le faisceau de test, mais il pourrait probablement faire avec un peu plus des cas de test :-)

Sub Macro1() 
    Dim i As Integer 
    Dim cobol As String 

    cobol = makeComp3(3.14159, 6, 2) 
    For i = 1 To Len(cobol) 
     MsgBox CStr(Asc(Mid(cobol, i))) 
    Next i 
End Sub 
+0

Salut, Je voulais que la conversion soit faite en VB mais je ne sais pas comment. Anywayz merci pour la réponse. Eh bien, y at-il de toute façon coder la conversion en VB? Ce que fait le programme, c'est qu'il lit une entrée de chaîne, puis convertit les chiffres numériques en COMP-3 dans cobol et les stocke dans un fichier texte. – Grekoz

+0

Voir la mise à jour. – paxdiablo