2012-12-20 9 views
5

Konieczne połączenie 4 ciągów do zmiennej docelowej w cobol.Łańcuch konkatenacji przez jego długość COBOL

Jak,

01 WS-S1 X(10) VALUE "HI ". 
01 WS-S2 X(10) VALUE "HOW ". 
01 WS-S3 X(10) VALUE "ARE ". 
01 WS-S4 X(10) VALUE "YOU?". 

do powstałego łańcucha

"HI HOW ARE YOU?" 

Czy ktoś może mi pomóc?

Odpowiedz

20

Oto przykład roboczy STRING verb że robi to, czego szukasz:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. EXAMPLE. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 WS-S1 PIC X(10) VALUE 'HI '. 
    01 WS-S2 PIC X(10) VALUE 'HOW '. 
    01 WS-S3 PIC X(10) VALUE 'ARE '. 
    01 WS-S4 PIC X(10) VALUE 'YOU?'. 
    01 WS-CONCAT PIC X(43) VALUE SPACES. 
    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
     STRING WS-S1 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S2 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S3 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S4 DELIMITED BY SPACE 
      INTO WS-CONCAT 
     END-STRING 
     DISPLAY '>' WS-CONCAT '<' 
     GOBACK 
     . 

wyjściowa wynosi:

>HI HOW ARE YOU?       < 
2

OpenCOBOL ma istotną rozszerzenie funkcji, CONCATENATE.

DISPLAY FUNCTION CONCATENATE(
    FUNCTION TRIM(WS-S1); SPACE; 
    FUNCTION TRIM(WS-S2); SPACE; 
    FUNCTION TRIM(WS-S3); SPACE; 
    FUNCTION TRIM(WS-S4)) 
END-DISPLAY 

ale lubię czasownika STRING ograniczona przez odpowiedź, jak to będzie działać z większość, jeśli nie wszystkie, kompilatorów.

Co do przyczyny ograniczników średnik wewnątrz listy parametr funkcji, nie jest to bezwzględnie konieczne, osobiste preferencje, jak to się czasem uniknąć potencjalnych problemów z

SPECIAL-NAMES. 
DECIMAL POINT IS COMMA. 

i COBOL, jest solidna leksykalne zwierzę, które jest

DISPLAY FUNCTION CONCATENATE(WS-S1 WS-S2 WS-S3 WS-S4) 
DISPLAY FUNCTION CONCATENATE(WS-S1, WS-S2, WS-S3, WS-S4) 

Składnia działa również.

0

Występuje problem z "ograniczonym spacją". Jeśli ws-s1 = "how are" - rozdzielone spacją, wstawi tylko "how". Oto przykłady:

01 ws-string-test. 
03 y1    pic x(10) value 'y1 a'. 
03 y2    pic x(10) value 'y2 b'. 
03 y3    pic x(10) value 'y3 c'. 

01 pic WS-pracy x (200).

 move spaces to ws-work 
     string y1 delimited by size 
       y2 delimited by space 
       y3 delimited by size 
       into ws-work. 
     ws-work = "y1 a  y2y3 c    " 

     move spaces to ws-work 
     string y1 
       y2 
       y3 
       delimited by size into ws-work 
     ws-work = "y1 a  y2 b   y3 c   " 


     string y1 
       y2 
       y3 
       delimited by spaces into ws-work. 
     ws-work = "y1y2y3 

     string y1 y2 y3 into ws-work by csv-format. 
     ws-work = "y1 a,y2 b,y3 c  " 

Mam nadzieję, że pomoże.

zalek

+0

To nie rozwiązuje faktycznego pytania. Który kompilator języka COBOL używa tej obsługi dla końcowej składni, którą wyświetlasz dla 'STRING'? Jest niestandardowy. –

0

Daj temu wir. Powinien być niezależny od platformy.

DATA DIVISION. 

    WORKING-STORAGE SECTION. 

    01 result-string-text   X(100). 
    01 result-string-length   9(03). 
    01 result-string-datalength  9(03). 

    01 new-string-text    X(20). 
    01 new-string-length   9(03). 
    01 new-string-datalength  9(03). 

    01 hold-string-text    X(100). 

    01 trailing-space-count   9(03). 

    PROCEDURE DIVISION. 

     MOVE SPACES TO result-string-text. 
     MOVE FUNCTION LENGTH(result-string-text) TO result-string-length. 
     MOVE FUNCTION LENGTH(new-string-text) TO new-string-length. 

     MOVE ws-s1 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s2 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s3 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s4 TO new-string-text. 
     PERFORM 5500-concatenate. 

    5500-concatenate. 
     MOVE ZERO TO trailing-space-count 
     INSPECT FUNCTION REVERSE(result-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
     COMPUTE result-string-datalength = result-string-length - trailing-space-count 

     IF (result-string-datalength > ZERO) 
      MOVE ZERO TO trailing-space-count 
      INSPECT FUNCTION REVERSE(new-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
      COMPUTE new-string-datalength = new-string-length - trailing-space-count 

      MOVE SPACES TO hold-string-text 
      STRING 
       result-string-text(1:result-string-datalength) 
       ' ' 
       new-string-text(1:new-string-datalength) 
        DELIMITED BY SIZE 
      INTO 
       hold-string-text 
      END-STRING 

      MOVE hold-string-text to result-string-text 
     ELSE 
      MOVE new-string-text TO result-string-text 
     END-IF. 
+0

Upuść 'PRZESTRZEŃ PRZESTRZEŃ DO tekstu wynikowego ', zmień' PRZENIEŚ ws-s1 DO nowego napisu' na 'PRZENIEŚ ws-s1 DO wyniku-ciąg-tekstu'. To pozbywa się twojego 'JEŻELI' w '5500-'. Użycie 'WITH POINTER' pozbywa się' hold-string-text'. Spowoduje to zmniejszenie rozmiaru akapitu o około 1/3, dzięki czemu będzie bardziej przejrzysty i łatwiejszy w utrzymaniu. Niektórzy, nie ja, użyliby modyfikacji odniesienia dla całej rzeczy. W konkretnym przykładzie z gwarancją braku osadzonych spacji wystarczy prosty "STRING" w zaakceptowanej odpowiedzi. –

+0

Doskonałe punkty, Bill. Podczas gdy gram z POINTER w całości, nie jestem pewien, czy wszyscy to robią. Nie chcę, żeby brzmiało to tak, jakbym kodował programistę LCD, ale myślę o tym, czy ktoś z ograniczonym doświadczeniem w języku COBOL, być może pochodzący z innego języka, przechadzał się lub został zepchnięty do COBOLU, jak mogliby zobaczyć kod.Modyfikator odniesienia nie ma podobnej składni jak SUBSTRING, ale wydaje się nieco bardziej intuicyjny. – Kennah

+0

"Z POINTEREM" Zgadzam się, że niewielu używa, lub wiedziałoby, jak go używać :-) Jednak czy powinno tak pozostać? Podnieśmy wyświetlacz LCD. Jego użycie może być komentowane. Zaletą STRING w porównaniu z modyfikacją referencji jest to, że kompilator opiekuje się rozmiarami pól, a nie programistą (lub nie). Inne sposoby na zrobienie tego również. Pamiętaj, że wiele osób znajduje lub tworzy kompleks "COMPUTE" :-) –

Powiązane problemy