COBOL Unstring в массив - PullRequest
       17

COBOL Unstring в массив

0 голосов
/ 17 сентября 2018

Я пытаюсь развернуть строку ввода, разделенную символом ";", в массив.Но у меня возникают проблемы с отображением каждого слова после первого ";".

Итак, в основном: Input: Hello; Stack; Overflow


Output: Value: 2 (из-за2 точки с запятой)


Строка 1 моей таблицы рекордов: Здравствуйте


Строка 2 моей таблицы рекордов: стек


Строка 3 моегоТаблица записей: переполнение

Мой код на данный момент:

*-------------------------------------------------------------
 LINKAGE SECTION.                                             
 01  X-INPUT-LINE                   PIC X(2000).              
 01  X-SEP-CHAR                     PIC X(1).                                     
 01  X-RET-TABLE.                                             
  02 CMAX                           PIC 9(5) COMP-3.          
  02 ENTRY-REC OCCURS 0 TO 9999 TIMES DEPENDING ON CMAX       
                                      INDEXED   BY CIDX.      
   04 ENTRY-REC2.                                             
    07 LINEVALUE                    PIC X(100).               

PROCEDURE DIVISION USING X-INPUT-LINE
                         X-SEP-CHAR  
                         X-RET-TABLE.

MAIN SECTION.
MN-00.       
INITIALIZE WERT.                                

INSPECT X-INPUT-LINE TALLYING WERT FOR ALL      
        X-SEP-CHAR.                             
MOVE X-INPUT-LINE TO VAL.                       

ADD 1 TO WERT.                                  
PERFORM WERT TIMES                              
MOVE WERT TO LINEVALUE OF X-RET-TABLE (WERT)    
     UNSTRING VAL DELIMITED BY ";"              
     INTO STRVAL                                
     END-UNSTRING                               


IF CMAX OF X-RET-TABLE < 9999                   
   ADD  1  TO CMAX OF X-RET-TABLE               
   MOVE STRVAL TO ENTRY-REC(CMAX OF X-RET-TABLE)

END-IF                                          
END-PERFORM.    

С помощью моего следующего кода я могу отображать только «Hello» в моем примере, и программа отображает его 3 раза в 3 разных строках.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Ваш оригинальный код почти работает.

Основная проблема в том, что вы UNSTRING задаете переменную и всегда используете одну и ту же начальную точку.

Он, мы можем использовать WITH POINTER. При использовании в STRING предложение говорит «позиция, в которой хранится следующий символ», при использовании в UNSTRING оно говорит «позиция, в которой читается следующий символ».

Используя начальный код (добавлен вызывающий код, фактически используется данный разделитель вместо фиксированного ";" и DISPLAY результата), добавлено здесь мы добавляем переменную для начальной точки и используй его.

     UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
     INTO STRVAL
     END-UNSTRING

становится

     UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
     INTO STRVAL
     WITH POINTER STARTING-POINT
     END-UNSTRING

Вам также нужно будет инициализировать некоторые части и напрямую использовать элемент таблицы (при условии, что счетчик не станет слишком большим), предоставляя вам результат (включает в себя больше образцов ).

0 голосов
/ 17 сентября 2018

Unstring действительно не работает таким образом.Unstring будет работать, если вы знаете имена полей того, в что вы хотите удалить строку.В основном то, что происходит в вашем коде, это то, что вы запускаете unstring 3 раза, и, поскольку "hello" - это первое, что в unstring, он не натягивается 3 раза.Если вы хотите сделать что-то масштабируемое в массиве, вам нужно было бы кодировать цикл следующим образом:

01 WS-UNSTRING-FIELDS.
   05 WS-INPUT PIC X(1000).
   05 WS-SUB   PIC 9(4) COMP.
   05 WS-START PIC 9(4) COMP VALUE 1.
   05 WS-INDEX PIC 9(4) COMP VALUE 0.
   05 WS-ARRAY OCCURS 0 TO 9999 DEPENDING ON WS-INDEX.

PERFORM VARYING WS-SUB
           FROM 1 BY 1 
          UNTIL WS-SUB > FUNCTION LENGTH(WS-INPUT)
   IF WS-INPUT(WS-SUB:1) = ";"
      ADD 1 TO WS-INDEX

      MOVE WS-INPUT(WS-START:WS-SUB - 1) 
        TO WS-ARRAY(WS-INDEX)

      COMPUTE
         WS-START = WS-SUB + 1
      END-COMPUTE
   END-IF
END-PERFORM

У меня не было времени, чтобы проверить это и убедиться, что он работает на 100%, но вы бынужно что-то в этом роде.Во всяком случае, я бы не использовал здесь unstring.

Unstring прекрасно работает, когда вы точно знаете, сколько полей вводите. Как, например, предположим, у вас есть общая программа, которая взаимодействует с сериями MQ.В качестве входных данных для этой программы вы можете передать строку, содержащую инструкции, например,

QueueName/Action

, которые затем вы можете использовать в этом контексте в качестве строки для разделения на 2 поля:

UNSTRING WS-INPUT DELIMITED BY "/"
   INTO WS-Q-NAME
        WS-ACTION
END-UNSTRING

Позволяетскажем, что здесь ввод был:

THIS_IS_MY_QUEUE/DELETE

WS-Q-NAME будет иметь THIS_IS_MY_QUEUE_NAME, а WS-ACTION будет иметь DELETE

...