是否可以在不提供输入文件的情况下执行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只是为了它的乐趣,现在想从我的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工作.我的代码中是否有明显的新手错误?
我想在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) 我想,最近发生了一些变化.
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) 我刚刚学习COBOL; 我正在写一个简单回应用户输入的程序.我已将变量定义为:
User-Input PIC X(30).
Run Code Online (Sandbox Code Playgroud)
稍后,当我接受用户输入,然后显示用户输入"加上一些额外的文本"时,它有一堆空格来填充30个字符.是否有标准方法(如Ruby的str.strip!)来删除多余的空格?
我正在尝试制作一个非常简单的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行("停止运行").但是,为什么呢?
我试图在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) 在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程序,该程序将值移动到应在值之前带有“£”的已编辑图片。
根据对先前问题的回答,有必要将源文件中的编码显式设置为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上按预期工作的方法?