Matt126
Matt126

Reputation: 997

How to combine spaces with letters

I try to create a string in Cobol with individually letters. Until I try to insert a Space, everything works. Do you have any Idea, how I could create e.x. the string

"  ee  ee"

?.

IDENTIFICATION DIVISION.
   PROGRAM-ID. EXAMPLE.
   DATA DIVISION.
   WORKING-STORAGE SECTION.

   01    S1 PIC X(10).

   PROCEDURE DIVISION.
   MAIN-PARAGRAPH.

   Perform InsertSpace 2 Times
   Perform InsertE 2 Times
   Perform InsertSpace 2 Times
   Perform InsertE 2 Times

   Display S1
*  expectation "  ee  ee"
   End-Main

   InsertE Section
   STRING S1 DELIMITED BY SPACE
       'e'     DELIMITED BY SIZE
          INTO S1
        END-STRING

   InsertSpace Section
   STRING S1 DELIMITED BY SPACE
       ' '     DELIMITED BY SIZE
          INTO S1
        END-STRING

Upvotes: 1

Views: 612

Answers (2)

Bill Woodger
Bill Woodger

Reputation: 13076

MOVE "  ee  ee" TO S1

That will do what you want.

It is difficult to be certain, as you don't show what result you do get, and it is unclear what "Until I try to insert a Space, everything works" means, but...

   01    S1 PIC X(10) VALUE SPACE.

Where S1 had no VALUE (and presuming you are not using a compiler which sets a default value for a PICture) the DELIMITED BY SPACE will take the whole 10 bytes, the values which a added by the STRING can never appear in the S1 unless it starts with a value of SPACE. With the value of SPACE, your four STRINGs should work. Err... no it won't, because of the SPACE, and the DELIMITED BY SPACE.

You can also use reference-modification, of course:

MOVE "  " TO S1 ( 1 : 2 )
MOVE "ee" TO S1 ( 3 : 2 )
MOVE "  " TO S1 ( 3 : 2 )
MOVE "ee" TO S1 ( 5 : )  

Or, if you don't want to pad the final part of the field to SPACE by default, change the last to ( 5 : 2 ), which will leave bytes nine and 10 of S1 unchanged.

If you can clarify what you want to achieve, and why you think STRING is the verb to use to do it, you may get better answers.

Upvotes: 3

NealB
NealB

Reputation: 16928

If you are trying to implement a process where one character at a time is added onto a character variable, then something like the following might work a bit better for you:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. EXAMPLE.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01  S1             PIC X(10) VALUE SPACE.
   01  S1-SUB         PIC S9(4) BINARY VALUE ZERO.
   PROCEDURE DIVISION.
       PERFORM INSERT-SPACE 2 TIMES
       PERFORM INSERT-E     2 TIMES
       PERFORM INSERT-SPACE 2 TIMES
       PERFORM INSERT-E     2 TIMES
       DISPLAY '>' S1 '<'
       GOBACK
       .
   INSERT-SPACE SECTION.
       COMPUTE S1-SUB = S1-SUB + 1
       MOVE SPACE TO S1 (S1-SUB : 1)
       .
   INSERT-E SECTION.
       COMPUTE S1-SUB = S1-SUB + 1
       MOVE 'E' TO S1 (S1-SUB : 1)
       .

S1-SUB keeps tract of the current character position and is incremented each time you PERFORM a section to add another character.

The above program displays: > EE EE <

Notice the trailing spaces? If you do not want these, the appropriate DISPLAY would be:

DISPLAY '>' S1 (1 : S1-SUB) '<'

which will limit the length of the display to only those characters you have explicity put into the variable. COBOL does not support variable length strings so you have to declare some PIC X type variable that can hold the maximum number of characters you want to display and then keep track of how many you have actually "used" and display only that many.

If this is the sort of thing you are looking for, I would also recommend checking for bounds errors (ie. adding too many characters). That can be done as follows:

   INSERT-E SECTION.
       COMPUTE S1-SUB = S1-SUB + 1
       IF S1-SUB > LENGTH OF S1
          PERFORM ERROR-ROUTINE
       END-IF
       MOVE 'E' TO S1 (S1-SUB : 1)
       .

Upvotes: 4

Related Questions