c - 如何在 Cobol 中打印变量名
问题描述
我正在尝试将 cobol 程序中的变量名称传递给 C 函数。
01 Message.
03 varA PIC X(32).
03 varB PIC X(32).
考虑到这个函数将在许多程序中使用,并且变量的结构Message
每次都会不同,我如何将变量的名称传递给 C 函数?我已经考虑制作另一个组数据项来包含变量名,但这对我来说不是一个好的解决方案。
我在 AIX 上使用 Microfocus Server Express v5.1。
解决方案
如何将变量的名称传递给 C 函数?
CALL USING
不能使用;直接传递变量名 至少,没有一个比组数据项更好。
我在这里所做的是创建一个类似 JSON 的对象,使用带有STRING
语句的REPLACE
语句来传递名称/值对。我之所以选择这种方法,是因为可以调用许多开源库C
来解码JSON
对象。它在文本长度和要传递的变量数量方面也非常灵活。
[编辑。更改了代码以将所有STRING
语句数据项放在REPLACE
语句中。更改了一些名称以反映“名称/值”配对。删除了嵌套程序的字符串长度代码。]
program-id. call-c.
data division.
working-storage section.
1 msg.
2 varA pic x(32) value "Message 1".
2 varB pic x(32) value "Message 2".
1 lengths binary.
2 len-1 pic 9(4).
2 len-2 pic 9(4).
replace
==name-1== by =="varA"==
==value-1== by ==varA(1:len-1)==
==name-2== by =="varB"==
==value-2== by ==varB(1:len-2)==
==newline== by ==x"0a"==
.
1 json-string pic x(256).
procedure division.
begin.
compute len-1 = function length (varA)
call "rtrim-len" using varA len-1
compute len-2 = function length (varB)
call "rtrim-len" using varB len-2
string
"{" newline
quote name-1 quote ": "
quote value-1 quote "," newline
quote name-2 quote ": "
quote value-2 quote newline
"}" x"00"
delimited size into json-string
call "c_prog" using
by reference json-string
stop run
.
program-id. rtrim-len.
data division.
linkage section.
1 str pic x(256).
1 str-len binary pic 9(4).
procedure division using str str-len.
begin.
perform varying str-len from str-len by -1
until str-len < 1 or str (str-len:1) not = space
continue
end-perform
exit program
.
end program rtrim-len.
end program call-c.
替代被调用程序的 COBOLC
程序。
program-id. "c_prog".
data division.
working-storage section.
1 json-string-count binary pic 9(4).
1 json-string-pos binary pic 9(4).
1 json-text-count binary pic 9(4).
1 json-text pic x(64).
linkage section.
1 json-string pic x(256).
procedure division using json-string.
begin.
move 0 to json-string-count
inspect json-string tallying
json-string-count for characters before x"00"
move 1 to json-string-pos
perform until json-string-pos > json-string-count
unstring json-string delimited x"0a" or x"00"
into json-text count json-text-count
pointer json-string-pos
display json-text (1:json-text-count)
end-perform
exit program
.
end program "c_prog".
输出:
{
"varA": "Message 1",
"varB": "Message 2"
}
如果TRIM
函数可用,则不需要长度计算、数据项和嵌套程序,REPLACE
语句变为,
replace
==name-1== by =="varA"==
==value-1== by ==trim(varA)==
==name-2== by =="varB"==
==value-2== by ==trim(varB)==
==newline== by ==x"0a"==
.
推荐阅读
- javascript - 如何更新firestore中数组内的对象?
- git - 在 TeamCity 构建完成器触发器中定义分支模式
- node.js - Cloud Firestore 模拟器未运行,因此调用 Firestore 会影响生产
- javascript - 未定义在 Dot Net Core/DotNet 中从 javascript 调用 C# 函数
- javascript - JS 使 forEach 匹配更有效
- reactjs - 如何将 ObjectURL 转换为图像
- android - 可绘制资源文件填充宽度
- python-3.x - 在 VSCode 中使用“重命名符号”时防止创建 .ropeproject
- sql - 统计两个表的外键重复次数
- node.js - 从 react 上传图片到 express