Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Displaying COBOL binary as numeric

Tags:

cobol

I'm entirely new to COBOL. I have a small COBOL program and a small C file. According to this article: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ceea400/sdtpt.htm the equivalent of a C signed integer in COBOL is

PIC S9(9) USAGE IS BINARY

I want to call the functions in the C file from COBOL, and display the result in COBOL. I am able to call the function, and it seems to behave as expected, data being passed as expected, but I'm not able to display the binary value with DISPLAY in COBOL.

My COBOL program:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. MSQLTST5_COBHELPER.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 SQLCODE PIC S9(9) USAGE IS BINARY VALUE 100.


   PROCEDURE DIVISION.
   HEAD SECTION.

   MAIN.

       DISPLAY "COBOL, sqlcode is: " SQLCODE.
       CALL "CONNECT_DEFAULT" USING SQLCODE.
       DISPLAY "COBOL, sqlcode is: " SQLCODE.

       STOP RUN.

   END PROGRAM MSQLTST5_COBHELPER.

The C function I'm calling:

void connect_default(int* sqlcode)
{
    printf("C, sqlcode is: %d\n", *sqlcode);
    // internal code that places the expected error code -14006 in the variable sqlcode
    printf("C, sqlcode is: %d\n", *sqlcode);
}

The output of running my COBOL program:

COBOL, sqlcode is: d
C, sqlcode is: 100
C, sqlcode is: -14006
COBOL, sqlcode is: J▒▒▒

It seems that the variable does indeed have the value 100 that I gave it, and then is passed correctly between C and COBOL, but when I ask COBOL to display the variable it seems to try to pick out the character that has the given ASCII code, rather than the numerical value, as the character 'd', which has the ASCII code 100, is displayed rather than the number 100.

How do I display this value as a numeric value in COBOL?

like image 925
Helena Avatar asked Mar 06 '18 08:03

Helena


People also ask

How do you convert character to numeric in COBOL?

The NUMVAL and NUMVAL-C functions convert character strings to numbers. Use these functions to convert alphanumeric data items that contain free format character representation numbers to numeric form, and process them numerically. For example: 01 R PIC X(20) VALUE "- 1234.5678".

What is binary format in COBOL?

BINARY data and synonyms COMP and COMP-4 are the two's complement data representation in COBOL. BINARY data is declared with a PICTURE clause as with internal or external decimal data but the underlying data representation is as a halfword (2 bytes), a fullword (4 bytes) or a doubleword (8 bytes).

How do you convert decimal to number in COBOL?

The formula for converting DECIMAL DB2 data type to COBOL equivalent is−DECIMAL(p,q) = PIC S9(p-q)V(q). Where V indicates implied decimal. The DECIMAL(7,3) can take a sample value as 7861.237 and this can be converted to COBOL equivalent as PIC S9(7-3)V(3) = PIC S9(4)V(3).


1 Answers

Why don't you transfer the contents of the SQLCODE field to a USAGE DISPLAY field using the MOVE instruction? It'll convert the binary number to a numeric one.

If the formatting is strange — here is why:

Signed numeric pictures without the SIGN SEPARATE clause must somehow include the sign without taking up space, so most compilers combine the last digit with the sign of the number. Most conventions use J for −1 till R for −9. They also pad the number with leading zeros. So -14006 will convert to 00001400O, because the last digit is a 6, and because it must be conbined with the minus sign, the last digit becomes -6, which is represented by an O. Roughly the same reasoning counts for 00000010{.

In order to reformat the number, you could actually use another picture, like

pic S9(9) sign leading separate

That will display -14006 as -000014006

like image 176
MC Emperor Avatar answered Sep 30 '22 18:09

MC Emperor