2010-07-01 8 views
8

Mam następujący problem w programie COBOL działającym na OpenVMS.Problem z przejściem COBOL do zmiennej komp-3

Mam następującą zmienną deklarację:

 01 STRUCT-1. 
      02 FIELD-A  PIC S9(6) COMP-3. 
      02 FIELD-B  PIC S9(8) COMP-3. 

     01 STRUCT-2. 
      03 SUB-STRUCT-1. 
       05 FIELD-A PIC 9(2). 
       05 FIELD-B PIC 9(4). 
      03 SUB-STRUCT-2. 
       05 FIELD-A PIC 9(4). 
       05 FIELD-B PIC 9(2). 
       05 FIELD-C PIC 9(2). 

i następujący kod:

 * 1st Test:  
      MOVE 112011 TO FIELD-A OF STRUCT-1 
      MOVE 20100113 TO FIELD-B OF STRUCT-1 

      DISPLAY "FIELD-A  : " FIELD-A OF STRUCT-1 CONVERSION 
      DISPLAY "FIELD-B  : " FIELD-B OF STRUCT-1 CONVERSION 

     * 2nd Test: 
      MOVE 112011 TO SUB-STRUCT-1. 
      MOVE 20100113 TO SUB-STRUCT-2. 
      MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1 
      MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1 

      DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1 
      DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2 
      DISPLAY "FIELD-A  : " FIELD-A OF STRUCT-1 CONVERSION 
      DISPLAY "FIELD-B  : " FIELD-B OF STRUCT-1 CONVERSION 

które wyjścia:

FIELD-A  : 112011 
FIELD-B  : 20100113 
SUB-STRUCT-1 : 112011 
SUB-STRUCT-2 : 20100113 
FIELD-A  : 131323 
FIELD-B  : 23031303 

Dlaczego FIELD-A i FIELD-B przechowywania wartości różni się od Wchodzę do nich w drugim teście?

mam inne Przechodzi z DISPLAY do COMP-3 zmiennych w moim programie, w którym nie pojawia się ten problem.

Odpowiedz

4

W języku COBOL dane na poziomie grupy są bez nazwy i są przenoszone bez przesyłania.

Dane poziomu elementu zawsze mają skojarzony typ danych. Dane w postaci są przesyłane zgodnie z typem elementu odbierającego podczas MOVE.

W pierwszym przypadku można MOVE dosłownym wartość liczbowa (112011) w wypełnionej obszarze dziesiętnym i kompilator przekształca go do właściwego typu procesu. Jak można się spodziewać w dowolnym języku programowania.

W drugiej instancji ty MOVE literał wartość do elementu grupy. Ponieważ jest to element grupy, kompilator nie może "poznać" zamierzonego typu danych, więc zawsze przesuwa grupę jako dane znakowe (bez konwersji numerycznych). Jest to w porządku, gdy element odbierający ma klauzulę PICTURE zgodną z danymi znakowymi - które to są FIELD-A i FIELD-B . Nie ma żadnej różnicy w wewnętrznej reprezentacji 9 przechowywanej jako PIC X i przechowywanej jako PIC 9. Obydwa są przyjmowane jako USAGE DISPLAY.

Teraz, gdy wykonujesz przeniesienie na poziomie grupy od SUB-STRUCT-1 do COMP-3 (Packed Decimal), skutecznie powiesz kompilatorowi, aby nie konwertował formatu z DISPLAY na COMP-3. I to właśnie dostajesz.

Spróbuj wprowadzić następujące zmiany w kodzie. Używanie REDEFINES tworzy numeryczny element elementarny do przeniesienia. Podczas przenoszenia elementarnych danych, COBOL wykona odpowiednią konwersję danych .


     01 STRUCT-2.     
      03 SUB-STRUCT-1.   
       05 FIELD-A PIC 9(2). 
       05 FIELD-B PIC 9(4). 
      03 SUB-STRUCT-1N REDEFINES 
       SUB-STRUCT-1 PIC 9(6). 
      03 SUB-STRUCT-2.   
       05 FIELD-A PIC 9(4). 
       05 FIELD-B PIC 9(2). 
       05 FIELD-C PIC 9(2). 
      03 SUB-STRUCT-2N REDEFINES 
       SUB-STRUCT-2 PIC 9(8). 

I następujący kod:


     * 3RD TEST:           
      MOVE 112011 TO SUB-STRUCT-1.     
      MOVE 20100113 TO SUB-STRUCT-2.     
      MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1  
      MOVE SUB-STRUCT-2N TO FIELD-B OF STRUCT-1  
      DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1   
      DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2   
      DISPLAY "FIELD-A  : " FIELD-A OF STRUCT-1 
      DISPLAY "FIELD-B  : " FIELD-B OF STRUCT-1 

Uwaga: Przenoszenie danych znaków w polu COMP-3 może dać bał danych SOC7 wyjątku Abend gdy element odbierający odwołuje. Dzieje się tak, ponieważ nie wszystkie wzorce bitowe są poprawnymi liczbami COMP-3.

+0

Człowieku, to zabiera mnie z powrotem. Pamiętam, kiedy chcieliśmy spojrzeć na ostatni bajt spakowanych pól dziesiętnych, ponieważ "04" oznaczało, że ktoś przeniósł wartość w przestrzeni EBCDIC. –

+0

@ David Thornley. Zamknij ... Przestrzeń EBCDIC to szesnastkowo "40". Dzisiaj używamy testu 'IF NUMERIC' na spakowanych polach dziesiętnych, aby sprawdzić tego rodzaju rzeczy. Coś, co wprawia w zakłopotanie wielu programistów jest to, że 'MOVE' nie wysadza się w powietrze, ale każde obliczeniowe odniesienie do pola po tym kończy się dając wyjątek danych abend (SOC7 w IBM land). Większość ludzi oczekuje, że 'MOVE' je wysadzi w powietrze. – NealB

+0

Nie tylko blisko: w dniu, w którym spakowaliśmy pola, ostatni bajt miał zamieniony węzeł, więc ciąg kończący 404040 hex zakończył się jako upakowane dziesiętne zakończenie 4404 hex. (To w rzeczywistości nie było COBOL, ale IBM 360 został specjalnie zaprojektowany do pracy w języku COBOL, z jedną instrukcją ASM, która wykonała sformatowany ruch, więc wyobrażam sobie, że moje doświadczenie ASM jest tu nieco istotne.) –

2

Masz 2 problemy.

COBOL ma kilka struktur danych numerycznych. Każdy ma swój własny zestaw zasad.

Dla PONOWNEJ DECYDUJĘ (COMP-3)
• Składniki numeryczne klauzuli PIC powinny ZAWSZE sumować się do numeru ODD. • Znacznik dziesiętny "V" określa położenie kropki dziesiętnej. • Poszczególne elementy MOVE i funkcje matematyczne zachowają wyrównanie wartości dziesiętnych - możliwe jest obcięcie wysokiego i niskiego poziomu • Konwersja typu danych liczbowych (strefa dziesiętna na spakowaną & binarna do spakowanej) jest obsługiwana.

np. S9 (5) V9 (2) COMP-3.
tym pozycjach 2 dziesiętnych> Długość oblicza się zaokrąglić [(7 + 1)/2] = 4 bajty

 S9(6)V9(2) COMP-3.            

tym pozycjach 2 dziesiętnych> Długość oblicza się w postaci okrągłych UP [(8 + 1)/2] = 5 bajtów Ale 1 ½ bajta jest adresowalny

Ostatni ½ bajta pól COMP-3 jest HEXIDECIMAL reprezentacją znaku.
Wartości ½ znaku w bajtach to C = znak dodatni D = znak ujemny F = niepodpisany (bez COBOL).

S9 (6) V9 (3) WARTOŚĆ COMP-3 123.45. Długość jest obliczana jako ROUND UP [(9 + 1)/2] = 5 bajtów
Zawiera X'00 01 23 45 0C '
Uwaga wyrównanie dziesiętne & zero dopełnienie.


poziomie grupy zasady MOVE

struktur terenowych COBOL danych to określić jako struktury hierarchiczne.

Pole grupa 01 HL - & każdy poziom pola podgrupa -

  1. jest prawie zawsze dorozumiana CHARAKTER wartość ciągu
  2. Jeśli osoba pole elementem jest 01 lub 77 poziom - to może być numeryczne.
  3. Poszczególne pola elementów zdefiniowane jako cyfry na poziomie grupy lub podgrupy będą traktowane jak cyfry, jeśli zostaną określone jako pole elementu Indywidualnego.
  4. Obowiązują zasady numeryczne. o prawym uzasadnić o, miejsc dziesiętnych wyrównanie O podkładka H-L (½ bajtów) zerami typu O dane liczbowe konwersji

Pole odbiorczy obliczeń MOVE lub matematyczny określa, czy wystąpi numeryczny konwersji danych.

Numeryczna konwersja danych Jeśli wykonujesz MOVE lub wykonasz obliczenia matematyczne przy użyciu dowolnego typu pola wysyłania (grupa lub element) do dowolnego pola odbierającego indywidualnego elementu zdefiniowanego za pomocą numerycznej klauzuli PIC ---, wówczas nastąpi konwersja danych liczbowych dla odbiorcy pole. S0C7 ulega uszkodzeniu, gdy dane inne niż numeryczne to MOVE 'd do odbierającego pole liczbowo zdefiniowane LUB gdy obliczenia matematyczne są wykonywane przy użyciu danych nieliczbowych.

Brak konwersji danych liczbowych Po przeniesieniu dowolnego typu pola (grupy lub elementu) do dowolnego pola poziomu grupy lub podgrupy, NIE będzie konwersji danych liczbowych.
• Obowiązują zasady MOVE dotyczące znaków.
• Wyrównanie w lewo: & pad ze spacjami.

Jest to jedna z głównych przyczyn danych nieliczbowych w polu liczbowo zdefiniowanym.

Jednym z podstawowych zastosowań PRZESUŃ na poziomie grupy wysyłającej zawierających pola elementów numerycznych do poziomu grupy odbiorczej zawierającej pola elementów numerycznych (odwzorowane identycznie) jest ponowna inicjalizacja liczbowych pól elementów za pomocą 1 instrukcji MOVE.

Maska wyczyść - lub - propagacja danych PRZESUŃ można również użyć do czyszczenia tabel - gdzie poziom grupy tabel jest większy niż 255 bajtów.

+0

Jest to w dużej mierze nonsens, a próbując wybrać z tego wiele pożytku, to ćwiczenie marnowania czasu. –

Powiązane problemy