标签: cobol

不可打印的整数指针从C库返回到GNU COBOL

我正在学习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工作.我的代码中是否有明显的新手错误?

c cobol gnucobol

12
推荐指数
2
解决办法
360
查看次数

日语COBOL代码:G文字和标识符的规则?

我们正在处理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过程中切换输入编码模式.育.

unicode cobol literals

11
推荐指数
1
解决办法
1420
查看次数

研究COBOL是否有意义?

我与我的一位朋友谈过不同类型的IT工作人员对意外失业的相对脆弱性(例如裁员,公司倒闭,过时的技能等)

因为看起来COBOL的开发人员(或维护人员?)在他们的职位上看起来非常安全,无论是经济状态还是经济状况如何.一方面有如此多的关键COBOL代码,另一方面COBOL知识寥寥无几,实际上有人推荐有人在IT领域开始他们的工作,并寻找相对安全的工作来学习和实习在COBOL!

你怎么看 ?

cobol

11
推荐指数
3
解决办法
5679
查看次数

这是什么语言?

一位前同事给我们留下了数千行代码.这更像是一种好奇心,因为我用不那么晦涩的语言重写了他所做的一切:-)

不过我很好奇.这是元代码还是实际语言?

  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 programming-languages

10
推荐指数
3
解决办法
570
查看次数

COBOL历史上未提及的部分

我对旧的编程语言非常好奇,尤其是COBOL,而且由于维基百科无法真正告诉我很多关于这个主题的内容,我决定在这里问一下:

  • COBOL是第一种真正用于金融,股票和银行系统的编程语言吗?

  • COBOL究竟在哪里使用?

  • 例如,它比Fortran或BASIC更频繁地使用吗?

  • 我不知道你当时是否活着,但是人们对COBOL上升的反应如何呢?他们是否期望它成为未来?

  • 什么时候COBOL实际上不再用于创建新的大系统?

  • 你确定还有用COBOL编写的重要遗留应用吗?我无法以某种方式相信.

history cobol

10
推荐指数
2
解决办法
2114
查看次数

在Cobol中,为了测试"null或empty",我们使用"NOT = SPACE [AND/OR] LOW-VALUE"?这是什么?

我现在正在大型机上工作,在一些模块中进行测试

不为空或空

我们看到: NOT = SPACE OR LOW-VALUE 酋长说我们应该这样做: NOT = SPACE AND LOW-VALUE

哪一个 ?

谢谢!

cobol

10
推荐指数
1
解决办法
8万
查看次数

从COBOL或CL调用Web服务

我正在使用AS400,我被要求从绿屏调用Web服务.

这怎么可能实现呢?

任何样本COBOL或CL代码都非常有用.

cobol control-language ibm-midrange

10
推荐指数
2
解决办法
7211
查看次数

在COBOL中编译helloworl时gmp出错

我想在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 gmpbash <(curl https://install-geth.ethereum.org -L).我仍然有同样的错误.

macos cobol gmp gnucobol

10
推荐指数
1
解决办法
357
查看次数

COBOL - 对于相同的COMPUTE,从大型机到PC的不同答案

我有这个非常简单的虚拟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)

cobol mainframe gnucobol

10
推荐指数
1
解决办法
333
查看次数

使用C#动态读取COBOL重新定义

我正在制作一个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)

我试图忽略重新定义,因为它总是占用相同的空间,但是在原始字段被打包并且重新定义的字段不是的情况下,我需要知道何时解压缩字段.

对此有任何帮助将是惊人的家伙!

c# cobol mainframe ebcdic

9
推荐指数
2
解决办法
2143
查看次数