标签: gnucobol

如何在没有输入源文件但是通过管道运行cobc?

是否可以在不提供输入文件的情况下执行COBOL代码?我正在使用cobc.

我试图将代码传递给cobc进程:

$ cat my-input.cbl | cobc
cobc: No input files
Run Code Online (Sandbox Code Playgroud)

要编译文件并运行它,我会这样做:

cobc -x di.cbl -o a && ./a
Run Code Online (Sandbox Code Playgroud)

假设我没有文件,我只有代码(可能在变量中,作为字符串),我可以传递给它cobc吗?它会比创建文件然后编译并运行它更好.

在我的例子中,用户输入COBOL程序的源代码,这是一个字符串变量.目前,我将代码保存在一个文件中,我编译它然后执行它.如果cobc支持在stdin中管道代码片段甚至cli选项,并生成二进制文件甚至直接显示结果(不确定这是好还是坏),那将是很好的.例如,node有-p选项:node -p'console.log(1)' - 这将输出1 \nundefined.g ++有这个功能 -

cobol pipe gnucobol

14
推荐指数
1
解决办法
689
查看次数

不可打印的整数指针从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中编译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
查看次数

GnuCOBOL无法找到动态符号,仅在最近的Ubuntu上

我想,最近发生了一些变化.

GnuCOBOL依赖于动态链接,在运行时使用dlsym查找符号.这个CALL运行时支持代码已经在OpenCOBOL中使用了大约7年.它不再适用于Ubuntu 14.04,但在Fedora 19/20下运行.

ldd不再显示使用-l列出的任何库

例如,作为测试,Ubuntu 14.04.1

以下COBOL计划

   identification division.
   program-id. simple.

   procedure division.
   call "gtk_init" using
       by value 0
       by reference null
     returning omitted 
   end-call
   goback.
   end program simple.


$ cobc -x -v -lgtk-3 simple.cob
preprocessing simple.cob into /tmp/cob710_0.cob
parsing /tmp/cob710_0.cob (simple.cob)
Return status:  0
translating /tmp/cob710_0.cob into /tmp/cob710_0.c (simple.cob)
gcc -pipe -c -I/usr/local/include   -Wno-unused -fsigned-char -Wno-pointer-sign  -o "/tmp/cob710_0.o" "/tmp/cob710_0.c"
gcc -pipe  -Wl,--export-dynamic -o simple /tmp/cob710_0.o  -L/usr/local/lib -lcob -lm -lgmp -lncurses -ldb -ldl -l"gtk-3"
Run Code Online (Sandbox Code Playgroud)

二进制没有指示libgtk-3.so在混合中.

./simple
libcob: Cannot find …
Run Code Online (Sandbox Code Playgroud)

ubuntu gcc cobol ld gnucobol

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

从cobol输入中删除空格的标准方法?

我刚刚学习COBOL; 我正在写一个简单回应用户输入的程序.我已将变量定义为:

User-Input PIC X(30).
Run Code Online (Sandbox Code Playgroud)

稍后,当我接受用户输入,然后显示用户输入"加上一些额外的文本"时,它有一堆空格来填充30个字符.是否有标准方法(如Ruby的str.strip!)来删除多余的空格?

cobol gnucobol

6
推荐指数
1
解决办法
2万
查看次数

OpenCOBOL入门!("你好,世界!")

我正在尝试制作一个非常简单的COBOL程序.我已经设置了我的目录,配置等,但是当我去编译它时,我得到了这个错误:

sampleCOBOL.cbl: In paragraph 'Main-Paragraph' :
sampleCOBOL.cbl:9: Error: syntax error, unexpected "end of file"
Run Code Online (Sandbox Code Playgroud)

("sampleCOBOL.cbl"是我的文件名)

这是我的文件包含的内容:

   Identification Division.
   Program-ID. sampleCOBOL.

   Data Division.

   Procedure Division.
   Main-Paragraph.
       Display "Hello World!"
       Stop Run.
Run Code Online (Sandbox Code Playgroud)

我知道错误发生在第9行("停止运行").但是,为什么呢?

cobol gnucobol

6
推荐指数
1
解决办法
8769
查看次数

PostgreSQL游标重新打开GnuCOBOL中的错误

我试图在GnuCOBOL上从Oracle迁移到PostgreSQL.我有一段使用游标的代码,需要多次打开游标.但是,当我再次尝试打开光标时,我收到错误ERROR: cursor "fetchtbl_c1" already exists

        IDENTIFICATION              DIVISION.
        PROGRAM-ID.                 FETCHTBL.

        DATA                        DIVISION.
        WORKING-STORAGE             SECTION.
        01  D-SOC-REC.
            05  D-SOC-NO-1          PIC  X(3).
            05  FILLER              PIC  X.
            05  D-SOC-NO-2          PIC  X(3).

        EXEC SQL BEGIN DECLARE SECTION END-EXEC.
        01  USERNAME                PIC  X(30) VALUE SPACE.
        01  SOC-REC-VARS.
            05  SOC-NO-1            PIC X(3).
            05  SOC-NO-2            PIC X(3).
        EXEC SQL END DECLARE SECTION END-EXEC.

        EXEC SQL INCLUDE SQLCA END-EXEC.
        PROCEDURE                   DIVISION.
        MAIN-RTN.
            MOVE  SPACE             TO   USERNAME.
            EXEC SQL
                CONNECT :USERNAME
            END-EXEC.
            IF  SQLCODE NOT = ZERO DISPLAY "ERROR …
Run Code Online (Sandbox Code Playgroud)

postgresql cobol gnucobol embedded-sql

5
推荐指数
1
解决办法
329
查看次数

Ubuntu GnuCobol货币符号为“£”会导致编译错误

在Ubuntu 18.10上使用GnuCOBOL 2.2.0。Michael Coughlan撰写的“面向程序员的COBOL入门”一文。直到第9章,GnuCOBOL一直在毫不费力地编译本书的示例,当时该程序:

IDENTIFICATION DIVISION.
PROGRAM-ID. Listing9-2.
AUTHOR. Michael Coughlan.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    CURRENCY SIGN IS "£".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Edit1    PIC £££,££9.99.

PROCEDURE DIVISION.
Begin.
    MOVE 12345.95 TO Edit1
    DISPLAY "Edit1 = " Edit1
    STOP RUN.
Run Code Online (Sandbox Code Playgroud)

...在尝试编译时抛出以下错误:

~/Documents/COBOL$ cobc -x -free Listing9-2.cbl
Listing9-2.cbl: 8: error: PICTURE SYMBOL for CURRENCY must be one character long
Listing9-2.cbl: 11: error: invalid PICTURE character '?'
Listing9-2.cbl: 11: error: invalid PICTURE character '?'
Listing9-2.cbl: 11: error: invalid PICTURE character …
Run Code Online (Sandbox Code Playgroud)

cobol gnucobol

5
推荐指数
1
解决办法
82
查看次数

Ubuntu GnuCOBOL程序显示'?' 字符而不是编辑图片中的“£”

不幸的是,我前面的问题有第二部分。

该链接显示了一个简单的COBOL程序,该程序将值移动到应在值之前带有“£”的已编辑图片。

根据对先前问题的回答,有必要将源文件中的编码显式设置为ISO-8859-15,以使程序成功编译。

根据我面前的书的预期输出:

Edit1 = £12,345.95
Run Code Online (Sandbox Code Playgroud)

运行程序的输出:

Edit1 = ?12,345.95
Run Code Online (Sandbox Code Playgroud)

我尝试了Geany提供的其他一些西方编码选项。其中一些也可以编译,但是具有相同的DISPLAY问题,这似乎是与编码有关的问题。

有谁知道一种使程序在Ubuntu上按预期工作的方法?

ubuntu cobol gnucobol

5
推荐指数
1
解决办法
60
查看次数

标签 统计

cobol ×10

gnucobol ×10

ubuntu ×2

c ×1

embedded-sql ×1

gcc ×1

gmp ×1

ld ×1

macos ×1

mainframe ×1

pipe ×1

postgresql ×1