我正在学习COBOL只是为了它的乐趣,现在想从我的COBOL源(使用GnuCOBOL)调用C函数.
我可以很好地调用C函数,但是我的函数有一个小问题,看起来像这样:(它只包含另一个具有相同参数的函数,现在)
int getSensors( char * protocol, int protocolLen,
char * model, int modelLen,
int * id, int * dataTypes ) {
return tdSensor(protocol, protocolLen, model, modelLen, id, dataTypes );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是id变量中返回的值以后在COBOL中不可打印(下面的TSI-ID).例如,返回的值可以是67,如果我在COBOL中打印变量,我得到ascii字符'C'而不是预期值0067.
COBOL记录如下所示:
01 TELLSTICK-SENSOR-ITER.
05 TSI-PROTOCOL PIC X(50).
05 TSI-MODEL PIC X(50).
05 TSI-ID PIC 9(4).
05 TSI-DATATYPES PIC 9(4).
05 TSI-RETURN PIC S9(4).
Run Code Online (Sandbox Code Playgroud)
我的电话看起来像这样:
CALL "getSensors" USING
BY REFERENCE TSI-PROTOCOL BY VALUE 50
BY REFERENCE TSI-MODEL BY VALUE 50
BY REFERENCE TSI-ID
BY REFERENCE TSI-DATATYPES
RETURNING TSI-RETURN.
Run Code Online (Sandbox Code Playgroud)
我是COBOL的新手,我的C技能非常生疏,因为我通常在Java工作.我的代码中是否有明显的新手错误?
我们正在处理IBMEnterprise日语COBOL源代码.
准确描述G类型文字中允许的内容以及标识符允许的内容的规则尚不清楚.
IBM手册指出G'....'文字必须有SHIFT-OUT作为引号内的第一个字符,SHIFT-IN作为结束引号前的最后一个字符.我们的COBOL词法分析器"知道"这个,但在实际代码中找到G字符的对象.结论:IBM手册错了,或者我们误解了它.客户不会让我们看到代码,因此诊断问题非常困难.
编辑:为了清楚起见,修改/扩展到文本下方:
有谁知道G字形的确切规则,以及它们(不)与IBM参考手册所说的相符?理想的答案是G字面的正则表达式.这就是我们现在使用的(由另一位作者编码,叹息):
#token non_numeric_literal_quote_g [STRING]
"<G><squote><ShiftOut> (
(<NotLineOrParagraphSeparatorNorShiftInNorShiftOut>|<squote><squote>|<ShiftOut>)
(<NotLineOrParagraphSeparator>|<squote><squote>)
| <ShiftIn> ( <NotLineOrParagraphSeparatorNorApostropheNorShiftInNorShiftOut>|
<ShiftIn>|<ShiftOut>)
| <squote><squote>
)* <ShiftIn><squote>"
Run Code Online (Sandbox Code Playgroud)
其中<name>是另一个正则表达式的宏.据推测,它们的名字足够好,所以你可以猜出它们包含的内容.
这是IBM Enterprise COBOL Reference.第3章"字符串",副标题"DBCS文字"第32页是相关阅读.我希望通过提供准确的参考,经验丰富的IBM员工可以告诉我们我们如何误读它: - {我特别不清楚"DBCS-characters"这个短语在什么时候表示" 该范围内有一个或多个字符 "对于任一字节,X'00 ...... X'FF"除了8位字符代码对之外,DBCS字符怎么样?如果你检查它,现有的RE匹配3种类型的字符对.
下面的一个答案表明<squote> <squote>配对是错误的.好吧,我可能会相信,但这意味着RE只会拒绝包含单个<squote>的文字字符串.我不相信这是我们遇到的问题,因为我们似乎绊倒了G字面的每个实例.
类似地,COBOL标识符可以用DBCS字符组成.究竟是什么允许标识符?同样,正则表达式将是理想的.
编辑2:我开始认为问题可能不是RE.我们正在阅读Shift-JIS编码的文本.我们的读者将该文本转换为Unicode.但是DBCS字符实际上不是Shift-JIS; 相反,它们是二进制编码数据.可能正在发生的事情是DBCS数据被翻译为就像它是Shift-JIS一样,这会破坏将"两个字节"识别为DBCS元素的能力.例如,如果DBCS字符对是:81:1F,则ShiftJIS读取器会将此对转换为单个Unicode字符,然后丢失其双字节性质.如果您不能计算对,则无法找到最终报价.如果找不到最终引用,则无法识别文字.所以问题似乎是我们需要在lexing过程中切换输入编码模式.育.
我与我的一位朋友谈过不同类型的IT工作人员对意外失业的相对脆弱性(例如裁员,公司倒闭,过时的技能等)
因为看起来COBOL的开发人员(或维护人员?)在他们的职位上看起来非常安全,无论是经济状态还是经济状况如何.一方面有如此多的关键COBOL代码,另一方面COBOL知识寥寥无几,实际上有人推荐有人在IT领域开始他们的工作,并寻找相对安全的工作来学习和实习在COBOL!
你怎么看 ?
一位前同事给我们留下了数千行代码.这更像是一种好奇心,因为我用不那么晦涩的语言重写了他所做的一切:-)
不过我很好奇.这是元代码还是实际语言?
DATA DIVISION.
WORKING-STORAGE SECTION.
78 dialog-system VALUE "DIV".
01 Display-Error.
03 Display-Error-No PIC 9(4) comp-5.
03 Display-Details-1 PIC 9(4) comp-5.
03 Display-Details-2 PIC 9(4) comp-5.
05 Display-Details-3 PIC 9(4) comp-5.
COPY "DS-CNTRL.MF".
COPY "ThisApp.txt".
PROCEDURE DIVISION.
*---------------------------------------------------------------*
Main-Process SECTION.
PERFORM Program-Initialize
PERFORM Program-Body UNTIL EXIT-FLAG-TRUE
PERFORM Program-Terminate
.
*---------------------------------------------------------------*
Program-Initialize SECTION.
INITIALIZE Ds-Control-Block
INITIALIZE Data-block
MOVE Data-block-version-no
TO Ds-Data-Block-Version-No
MOVE Version-no TO Ds-Version-No
MOVE Ds-New-Set TO Ds-Control
MOVE "MyApp" TO Ds-Set-Name
.
*---------------------------------------------------------------*
Program-Body SECTION.
PERFORM Call-Dialog-System
. …Run Code Online (Sandbox Code Playgroud) 我对旧的编程语言非常好奇,尤其是COBOL,而且由于维基百科无法真正告诉我很多关于这个主题的内容,我决定在这里问一下:
COBOL是第一种真正用于金融,股票和银行系统的编程语言吗?
COBOL究竟在哪里使用?
例如,它比Fortran或BASIC更频繁地使用吗?
我不知道你当时是否活着,但是人们对COBOL上升的反应如何呢?他们是否期望它成为未来?
什么时候COBOL实际上不再用于创建新的大系统?
你确定还有用COBOL编写的重要遗留应用吗?我无法以某种方式相信.
我现在正在大型机上工作,在一些模块中进行测试
不为空或空
我们看到:
NOT = SPACE OR LOW-VALUE
酋长说我们应该这样做:
NOT = SPACE AND LOW-VALUE
哪一个 ?
谢谢!
我正在使用AS400,我被要求从绿屏调用Web服务.
这怎么可能实现呢?
任何样本COBOL或CL代码都非常有用.
我想在COBOL中运行这个hello world程序:
Identification Division. program-id. HelloWorld.
Procedure Division.
Display 'Bonjour '.
Display 'Comment allez vous ? ' .
goback.
Run Code Online (Sandbox Code Playgroud)
但是,我有这个错误:
In file included from /var/folders/t7/vdtg6q9x6lggwrpz06f0fz9h0000gn/T//cob4607_0.c:13:
/usr/local/Cellar/open-cobol/1.1/include/libcob.h:24:10: fatal error: 'gmp.h' file not found
#include <gmp.h>
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
为了编译,我做了: cobc -x -free helloworld.cob
我使用的COBOL编译器是open-cobol,我使用以下命令行安装:brew install open-cobol.
我试图卸载gmp(brew uninstall gmp),然后用两种不同的方法重新安装它:
brew install gmp和bash <(curl https://install-geth.ethereum.org -L).我仍然有同样的错误.
我有这个非常简单的虚拟COBOL程序,它执行一个虚拟COMPUTE并显示结果.
ID DIVISION.
PROGRAM-ID. DUMMYPGM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC 9(3) VALUE 399.
01 NUM-B PIC 9(3) VALUE 211.
01 NUM-C PIC 9(3).
*
PROCEDURE DIVISION.
MAIN.
COMPUTE NUM-C = ((NUM-A / 100) - (NUM-B / 100)) * 100
DISPLAY 'NUM-C IS ' NUM-C
STOP RUN.
Run Code Online (Sandbox Code Playgroud)
当我在大型机上编译此代码(使用编译器MVS Enterprise COBOL V4.2)并执行它时,我得到"NUM-C IS 100",可能因为(399/100)被视为3而不是3.99计算(同样适用于211/100).
但是当我在PC上编译完全相同的代码(使用GnuCobol编译器)并执行它时,我得到"NUM-C IS 188".PC的答案是正确的,但我想让它的行为与大型机一样(因此,在该计算语句中失去精度而不是188而不是)... ...我该怎么做?
上述原因是此代码的一般表达式:
COMPUTE PDISCR = (((((X(1) + DX - XBRAK) * (ABRAK(1) / 1000)) / 100)
+ PHT(1) + DPH - PHBRAK) * …Run Code Online (Sandbox Code Playgroud) 我正在制作一个C#程序,它能够动态读取用COBOL编写的IBM HOST Copybook,并生成一个SQL表.生成表后,我可以将文件上传到我的程序中,它将读取,从IMB-37转换并将文件插入到该sql表中.到目前为止,我几乎可以处理任何事情,尽管我遇到了REDEFINES的一些问题.
例如:
10 SOME-FIELD PIC 9(3) COMP-3. SCRRB205
4117 10 SOME-OTHER-FIELD REDEFINES 3041-17
4117 SOME-FIELD PIC X(2). 3041-17
Run Code Online (Sandbox Code Playgroud)
我理解在这种情况下重新定义取代了它上面的字段,虽然我不明白的是编译器如何知道它是否应该使用重新定义.我假设在这种情况下,它将是因为第一个是第二个是一个字符的数字,尽管在下面的例子中它们都使用了字符.
05 STREET-ADDRESS.
10 ADDRESS-LINE-1 PIC X(20).
10 ADDRESS-LINE-2 PIC X(20).
05 PO-BOX REDEFINES STREET-ADDRESS PIC X(40).
Run Code Online (Sandbox Code Playgroud)
我试图忽略重新定义,因为它总是占用相同的空间,但是在原始字段被打包并且重新定义的字段不是的情况下,我需要知道何时解压缩字段.
对此有任何帮助将是惊人的家伙!