2

I’m new to COBOL and GnuCOBOL (in Windows).

I'm trying to write a recursive function with a tail, but the program does not return values it would be possible to help me. I wonder if what I want is possible in language?

Follows function code

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATBASE.

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-PAR PIC 99.

   LINKAGE SECTION.
   77  LK-NUM PIC 99.
   77  LK-PAR PIC 99.
   77  LK-FAT PIC 9(33).

   PROCEDURE DIVISION USING BY VALUE LK-NUM, LK-PAR
   RETURNING LK-FAT.
       IF NUMVAL(LK-NUM) = 0
          COMPUTE LK-FAT = NUMVAL(LK-PAR)
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF
       GOBACK.
   END FUNCTION FATBASE.

Follows code of the program that calls the function

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TESTEFAT.

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATBASE
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-FAT PIC Z(33).

   PROCEDURE DIVISION.
       ACCEPT LS-NUM.
       MOVE FATBASE(LS-NUM, 1) TO LS-FAT
       DISPLAY FATBASE(LS-NUM, 1)
       STOP RUN.

As for the IF/THEN command, these are working properly. The problem is occurring with the COMPUTE commands. The lines with COMPUTE do not seem to be having the expected calculation effect. It seems that only the LS-NUM and LK-NUM variable have any value. The other variables are zeroed during processing.

       IF NUMVAL(LK-NUM) = 0
          COMPUTE LK-FAT = NUMVAL(LK-PAR)
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF

In advance thanks for any help.

The programs are attached.

Best regards.

===========================================================================

At the end of the day after this post I got external help - available at: https://sourceforge.net/p/open-cobol/discussion/cobol/thread/54637a961a/?limit=250#313c/7037/dbaf/3684

  • DISPLAY FATBASE(LS-NUM, 1) <- You're passing a 1 byte numeric constant in a position you defined with a length of 2. Either pass the correct size, 01, or better yet pass it in a field defined with PIC 99. – Jim Castro Jun 16 '20 at 16:59

1 Answers1

0

Follows the base code of the factorial operation by tail

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATBASE.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-PAR PIC 9(33).

   LINKAGE SECTION.
   77  LK-NUM PIC 99.
   77  LK-PAR PIC 9(33).
   77  LK-FAT PIC 9(33).

   PROCEDURE DIVISION USING BY VALUE LK-NUM, LK-PAR
   RETURNING LK-FAT.
       IF LK-NUM = 0
          COMPUTE LK-FAT = LK-PAR
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF
       GOBACK.
   END FUNCTION FATBASE.

Follows the code of the intermediate sub-routine of the factorial execution

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATOR2.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATBASE
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 9(2).
   77  LS-PAR PIC 9(33).

| LINKAGE SECTION. 77 LK-NUM PIC 99. 77 LK-FAT PIC 9(33).

   PROCEDURE DIVISION USING LK-NUM RETURNING LK-FAT.
       MOVE NUMVAL(LK-NUM) TO LS-NUM
       MOVE 1 TO LS-PAR
       COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       GOBACK.
   END FUNCTION FATOR2.

Follows the code of the program that uses the tail recursive factorial function.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TESTEFAT.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATOR2
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-FAT PIC Z(33).

   PROCEDURE DIVISION.
       ACCEPT LS-NUM.
       MOVE FATOR2(LS-NUM) TO LS-FAT
       DISPLAY TRIM(LS-FAT).
       STOP RUN.