Прошло около 20 лет с тех пор, как я делал такие вещи;но я помню, что не существует прямого способа «отменить ссылку» на C pointer
в COBOL
.Это должно быть сделано косвенно.
Изменить:
01 DWORD-PTR pic s9(9) comp-5 value 0 typedef.
на
01 DWORD-PTR POINTER typedef.
Добавить:
linkage section.
01 ls-dword DWORD.
После добавления call
:
set address of ls-dword to dwActiveProcessorMask
После оператора set
содержимое ls-dword
будет таким же, как и содержимое dwActiveProcessorMask
.
(В стандарте 2002 года BASED
для обработки этих ситуаций было добавлено предложение.)
Это первая часть SYSTEM_INFO
.
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
};
};
DWORD dwPageSize;
, которую вы определили как:
05 dwOemId DWORD.
05 wProcessorArchitecture WORD.
05 wReserved WORD.
05 dwPageSize DWORD.
В языке COBOL C
union
становится REDEFINES
, то есть wProcessorArchitecture
и wReserved
занимают то же пространство, что и dwOemId
.Поскольку dwOemId
устарел, его следует удалить.В действительности SYSTEM-INFO
на 4 байта длиннее, чем должно быть.