Checking for incompatible data (numeric class test)
The compiler assumes that values you supply for a data
item are valid for the PICTURE
and USAGE
clauses,
and does not check their validity. Ensure that the contents of a data
item conform to the PICTURE
and USAGE
clauses
before using the item in additional processing.
It
can happen that values are passed into your program and assigned to
items that have incompatible data descriptions for those values. For
example, nonnumeric data might be moved or passed into a field that
is defined as numeric, or a signed number might be passed into a field
that is defined as unsigned. In either case, the receiving fields
contain invalid data. When you give an item a value that is incompatible
with its data description, references to that item in the PROCEDURE
DIVISION
are undefined and your results are unpredictable.
You can use the numeric class test to perform data validation. For example:
Linkage Section.
01 Count-x Pic 999.
. . .
Procedure Division Using Count-x.
If Count-x is numeric then display "Data is good"
PICTURE
and USAGE
of
the data item. For example, a packed decimal item
is checked for hexadecimal values X'0' through X'9' in the digit positions
and for a valid sign value in the sign position (whether separate
or nonseparate). An external decimal
data item that has USAGE DISPLAY
is checked for hexadecimal
values X'0' through X'9' in the digit positions (the lower 4 bits
of each byte), for a valid zone code in the upper 4 bits of each byte
and for a valid sign value in the sign position (whether separate
or nonseparate). The sign code is in the upper 4 bits of the sign
byte or in a separate byte if SIGN IS SEPARATE
was
specified. If the SIGN IS SEPARATE
clause is used,
the upper four bits of all bytes must be x'F'. ZONEDATA(MIG|NOPFD)
compiler
option allows toleration of invalid zone codes in USAGE DISPLAY
numeric
(zoned decimal) data items in numeric comparisons, invalid zone codes
in zoned decimal data items will be treated as nonnumeric by the numeric
class test. For zoned decimal and packed decimal items, the numeric
class test is affected by the NUMPROC
compiler option
and the NUMCLS
option (which is set at installation
time). To determine the NUMCLS
setting used at your
installation, consult your system programmer.
If NUMCLS(PRIM)
is
in effect at your installation, use the following table to find the
values that the compiler considers valid for the sign.
NUMPROC(NOPFD) |
NUMPROC(PFD) |
|
---|---|---|
Signed | C, D, F | C, D, +0 (positive zero) |
Unsigned | F | F |
Separate sign | +, - | +, -, +0 (positive zero) |
If NUMCLS(ALT)
is in
effect at your installation, use the following table to find the values
that the compiler considers valid for the sign.
NUMPROC(NOPFD) |
NUMPROC(PFD) |
|
---|---|---|
Signed | A to F | C, D, +0 (positive zero) |
Unsigned | F | F |
Separate sign | +, - | +, -, +0 (positive zero) |
You can also use the
NUMCHECK(ZON,PAC)
option
to have the compiler generate implicit numeric class tests for zoned
decimal (numeric USAGE DISPLAY
) and packed decimal
(COMP-3
) data items that are used as sending data
items. This numeric class test validates data and also validates sign
fields against the NUMPROC
compiler option to help
you decide whether you can use NUMPROC(PFD)
or not.
For details, see NUMCHECK.