Search code examples
booleancobolgnucobol

How can I return true in COBOL


So I am making a program that checks if a number is divisible by another number or not. If it is its supposed to return true, otherwise false. Here's what I have so far.

P.S : I'm using IBM (GnuCOBOL v2.2 -std=ibm-strict -O2) to run this.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. CHECKER.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 BASE           PIC 9(5).
       01 FACTOR         PIC 9(2).
       01 RESULT     PIC 9(5).
            88 TRU  VALUE 0 .
            88 FAL  VALUE 1 THRU 99 .
       PROCEDURE DIVISION.
       CHECK-FOR-FACTOR SECTION.
            IF FUNCTION MOD(BASE, FACTOR) = 0 THEN
                  SET TRU TO TRUE
            ELSE
                  SET FAL TO TRUE
            END-IF.
       END PROGRAM CHECKER.

It gives me error saying invalid use of level 88. I'm sure I'm making a mistake, and I've searched for couple of days and I can't seem to find anything that can help me with it. Any ideas if it is possible in COBOL or does COBOL handle all the boolean stuff some other way ?

(Kindly do not reply with look up level 88 or some other stuff like that, I have already looked them up and they haven't been helping)


Solution

  • To return TRUE from a program you'd need an implementation that has boolean USAGE, define that in LINKAGE and specify it in PROCEDURE-DIVISION RETURNING true-item and also use CALL 'yourprog' RETURNING true-item.

    Your specified environment GnuCOBOL doesn't have a boolean USAGE in 2021 and can't handle RETURNING phrase of PROCEDURE DIVISION in programs.

    But you can use a very common extension to COBOL which is available in both IBM and GnuCOBOL:

    Before the program ends MOVE RESULT TO RETURN-CODE (which is a global register) and in the calling program check its value (and reset it to zero). Then it is only up to you what value means "true" (in your program it is 0).

    As an alternative you could create a user-define function (FUNCTION-ID instead of PROGRAM-ID and use the RETURNING phrase to pass your result) - but that would mean you need to use IF FUNCTION instead of CALL + IF RETURN-CODE in each caller.