Offset/length specifications are made by appending [+off][(len)] to the name of a data object in operand position, and the specifications are used to access subareas of a data object. This type of programming is no longer completely possible in Unicode systems because, for example when accessing structures with components of different data types, it is not possible to define whether offset and length should be specified in characters or bytes. Furthermore, restrictions have been introduced that forbid access to memory areas outside of flat data objects.
Offset/length specifications for elementary data objects
Offset/length specifications are permitted for character-type and byte-type data objects. The specification of offset and length is interpreted either as a number of characters or as a number of bytes. The rules that determine which data objects in Unicode programs count as character-type or byte-type objects do not allow for offset/length specifications for data objects of numeric data types.
Note
The method of using data objects of type c as containers for storing structures of different types, which are often not known until runtime, in which components are accessed using offset/length access, is no longer possible in Unicode programs. Instead of these containers, the statement CREATE DATA can be used to generate data objects of any structure. To enable access to existing containers, these can be assigned to a field symbol using the CASTING addition of the statement ASSIGN. The COMPONENT addition can then be used to access components.
Offset/length specifications for structures
An offset/length specification for a structure is only permitted in Unicode systems if the structure is either
- character-type (i.e. it only contains flat character-type components), or it is
- flat, has a character-type initial fragment according to the Unicode fragment view, and the offset/length specification accesses this initial fragment.
In both cases, the specification of offset and length is interpreted as a number of characters.
Example
The following structure has both character-type and non-character-type components:
- BEGIN OF STRUC,
a TYPE c LENGTH 3, "Length 3 characters
b TYPE n LENGTH 4, "Length 4 characters
c TYPE d, "Length 8 characters
d TYPE t, "Length 6 characters
e TYPE decfloat16, "Length 8 bytes
f TYPE c LENGTH 28, "Length28 characters
g TYPE x LENGTH 2, "Length 2 bytes
END OF STRUC.
The Unicode fragment view splits the structure into four areas F1 - F5.
[ aaa | bbbb | cccccccc | ddd | AAA | eeee | fffffffffffff | gg ]
[ F1 | F2 | F3 | F4 | F5 ]
Offset/length access is only possible for the character-type initial fragment F1. Specifications such as struc(21) or struc+7(14) are accepted and are handled as a single field of type c. An access such as struc+57(2), for example, is not permitted in Unicode systems.
Offset/length specifications for actual parameters
For actual parameters specified in PERFORM, in Unicode programs, it is not possible to specify a memory area outside of the actual parameter using offset/length specifications. In particular, it is no longer possible to specify an offset without a length, as this would implicitly set the length of the actual parameter.
Offset/length specification for field symbols
When assigning a memory area to a field symbol using the ASSIGN statement, in Unicode programs it is now only possible to use offset/length specifications to access the memory within the data object. The addition RANGE determines the data object.
Field symbols themselves are also allocated an assignable memory area. This is effective if a field symbol is used as a source in the ASSIGN statement.
In non-Unicode programs, the assignable area is defined by the data area of the current program, which can lead to references being overwritten.
If a data object is entered as a source in ASSIGN, no offset can be specified without a length unless the explicit RANGE addition is specified. Otherwise, this would implicitly set the length of the data object. If the name of a field symbol is specified, its data type in Unicode programs must be flat and elementary if an offset is specified without a length.
Note
Previously, cross-field offset/length accesses could be usefully implemented in the ASSIGN statement for processing repeating groups in structures. In order to enable this in Unicode systems, the ASSIGN statement has been enhanced with the additions RANGE and INCREMENT.
No comments:
Post a Comment