- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
大型机上用 C 语言编写的供应商包提供了通过用户导出覆盖其部分功能的选项。提供的 C 函数原型(prototype)为:
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
因为我们主要是一家 COBOL 商店,所以我定义了一个企业 COBOL 4.2 程序(作为 DLL)来实现导出,试图遵循 IBM ILC 指南 (https://www.ibm.com/support/knowledgecenter/en/SSLTBW_1.13.0/com.ibm.zos.r13.ceea400/clcccb5.htm#clcccb5) 中给出的约定和这个旧的 SHARE 演示文稿中的示例: http://www-01.ibm.com/support/docview.wss?uid=swg27003846&aid=1但是生成的程序在调用退出时和在我的 DISPLAY
消息之前异常终止。我的假设是我没有正确声明接收数据结构。下面是我当前测试代码的一个片段(忽略我的命名约定——这是一个证明接口(interface)的原型(prototype),一旦我的基本调用工作正常,它将被重写为我们的内部标准)。
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-COMPARISION-TYPE PIC X.
01 WS-RANK-STRING-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING BY VALUE WS-PARAMETERS-POINTER
SORT-PASS-RECORD1-POINTER
SORT-PASS-RECORD2-POINTER
WS-COMPARISION-TYPE
WS-RANK-STRING-POINTER
WS-NOT-USED1-POINTER
WS-NOT-USED2-POINTER
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
异常结束是:
CEE3250C The system or user abend U 016 R=00000000 was issued.
From entry point main at compile unit offset +00000192 at entry offset +00000192 at address 28500ECA.
供应商代码动态调用 DLL。当我删除 DLL 时,我收到一条消息,指出无法找到导出,因此 C 代码似乎正在尝试调用它。
我尝试了 PROCEDURE DIVISION USING
的变体,包括删除 BY VALUE
,使用 BY REFERENCE
(虽然我知道这是默认设置) 并将 POINTERs
替换为实际的结构定义。我是否误解了有关如何构造传递给 COBOL 例程的参数的手册?
编辑:我确实有一个与供应商的支持票,但他们还没有回应任何有用的东西。
谢谢,大卫
最佳答案
多亏了评论,我才能够根据 Bills 的建议更好地理解调用结构来确定解决方案。给定这个 C 原型(prototype):
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
解决方法:
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS PIC X(10).
01 SORT-PASS-RECORD1 PIC X(50).
01 SORT-PASS-RECORD2 PIC X(50).
01 WS-COMPARISON-TYPE PIC X.
01 WS-RANK-STRING PIC X(6).
01 WS-NOT-USED1 PIC X.
01 WS-NOT-USED2 PIC X.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING
BY REFERENCE WS-PARAMETERS
BY REFERENCE SORT-PASS-RECORD1
BY REFERENCE SORT-PASS-RECORD2
BY VALUE WS-COMPARISON-TYPE
BY REFERENCE WS-RANK-STRING
BY REFERENCE WS-NOT-USED1
BY REFERENCE WS-NOT-USED2
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
通过以上操作,成功调用了用户导出并向供应商逻辑返回了一个值。我使用以下参数进行编译 RENT, TRUNC(BIN), DLL,EXPORTALL
和链接 DYNAM(DLL),RENT
。我的应用程序不需要,但如果调用程序期望在被调用程序中使用大小写混合的例程名称,如上述示例解决方案中所用,那么 PGMNAME(LONGMIXED)
也将需要。
感谢所有评论者为我指明了正确的方向。
关于C -> 大型机上的 COBOL 跨语言通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390918/
我编写了以下程序,我很困惑为什么在编译程序时出现错误,说 A-COL(1,1) 不是数值,而显示 A-COL(1,1) 给我 1。 IDENTIFICATION DIVISION. PRO
需要将 4 个字符串连接到 cobol 中的目标变量。 喜欢, 01 WS-S1 X(10) VALUE "HI ". 01 WS-S2 X(10) VALUE "HOW ". 01 WS-S3 X(
大家好,这里有一大堆问题。我已经完成了一个我必须为大学作业做的程序,但是当我运行它时,输出几乎没有显示它应该显示的内容。这只发生在我运行它时。如果我在整个过程中按住 F11 到 STEP,它会显示预期
正如标题所暗示的,我正在做一个软件来计算和验证插入的数字是否是一个快乐的数字(或不是)。在 COBOL 语言中(有关什么是快乐数字的引用 https://mathworld.wolfram.com/H
为什么我不能在 COBOL 中执行此嵌套执行循环? 如果我把END-PERFORM。在任何一行中比我在 EXIT PROGRAM 之前拥有最后一个的地方早 - 它有效。但是我需要程序每次都显示 INP
我知道许多 COBOL 编译器确实允许嵌套副本(具有不同的深度),但我没有找到任何“官方”规则。问题: 是否有明确允许或禁止嵌套副本的 COBOL 标准? 有没有不允许嵌套copybooks的COBO
我对 COBOL 很陌生。我正在学习 Micro Focus 附带的教程,但似乎无法让示例正常工作。我正在尝试打印 -123.45 并且我不断收到以下信息, 我查了很多帖子,都没有解决我的问题。我在
COBOL 中是否有一种“等待”功能? 我写了一个计算器,为了让它更 50 多岁,我打印了“计算”。 “计算..” ecc 例如: DISPLAY "SECOND
好的,所以我正在做作业,但是随后我发现我被要求添加页码并为每4条记录更改页数。由于这是一门在线课程,我认为讲座视频中没有关于页码的任何信息。所以主要的问题是 要添加包含日期和页码的标题, 每页打印4条
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
Cobol 程序: PROGRAM-ID. SCHPROG. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION.
我正在使用屏幕部分在 Cobol 中开发一个系统,当我在另一个程序中创建的菜单中选择一个选项时,我无法调用客户注册程序。我正在使用带有 GnuCOBOL 编译器的 opencobol。 CALL "A
我正在构建一个 COBOL 程序来计算最多 15 个整数的平均值。执行显示的数字远大于预期,并带有很多尾随零。以下是相关代码: Data Division. Working
我正在开发一个 Wrapper/Bridge COBOL 程序,该程序处理程序调用并执行横切操作,如日志记录、安全检查等。 主要动机是检查消费者程序的安全访问是否有权调用生产者程序。 设桥接 COBO
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我有一项将 COBOL 代码转换为 .NET 的任务。有没有可用的转换器?我试图在高层次上理解 COBOL 代码。我无法理解 COBOL 代码。有流程图生成器吗?我很感激任何帮助。 谢谢.. 最佳答案
我有以下代码: 01 W-IX1 PIC 9(8) VALUE ZERO COMP-4. 01 W-INPUT-AMNT
我是 COBOL 编程的新手,所以我试图制作一个示例计算器,但我无法让它工作。 calc 进入无限循环,我没有找到原因,我什至尝试复制类似的代码,但没有成功。那么,这是 OpenCobolIDE 问题
我只是在学习 COBOL;我正在编写一个简单地回显用户输入的程序。我已经定义了一个变量: User-Input PIC X(30). 后来当我接受用户输入,然后显示用户输入“加上一些额外的文本”时,它
是否可以在Cobol程序中获取并显示当前行号?例如,C 允许通过以下方式进行: ... printf("Current line = %d\n", __LINE__); ... 最佳答案 简答:否。
我是一名优秀的程序员,十分优秀!