我试图用GnuCOBOL 2.0.0创建一个递归的用户定义函数,但是当我试图运行调用程序时,它会崩溃,出现一个“分割失败”错误。
这是一项功能:
identification division.
function-id. FATORIAL.
author. Paulo Andre Dias.
date-written. 15/02/2017.
remarks. Calcula o fatorial do numero N informado via argumento.
environment division.
configuration section.
data division.
working-storage section.
77 ws-fatorial-n-menos-1 pic 9(006) value zeros.
linkage section.
01 lk-n pic 9(006).
01 lk-fatorial pic 9(006).
procedure division using lk-n returning lk-fatorial.
principal.
if lk-n = zeros
move 1 to lk-fatorial
else
move FATORIAL(lk-n - 1) to ws-fatorial-n-menos-1
compute lk-fatorial = lk-n * ws-fatorial-n-menos-1
end-if
goback.
end function FATORIAL.这是呼叫者程序:
identification division.
program-id. gtc002.
environment division.
configuration section.
repository.
function FATORIAL.
data division.
working-storage section.
77 ws-n pic 9(006) value zeros.
procedure division.
main.
display "Entre com um numero inteiro positivo (ou zero para encerrar):"
accept ws-n from console
if ws-n = zeros
stop run
else
display "O fatorial de " ws-n " e' " FATORIAL(ws-n)
end-if
go to main.这就是发生的事情:
[aeisxpad ~/cbl]$ ../bin/gtc002
Entre com um numero inteiro positivo (ou zero para encerrar)::
5
Falha de segmentação
[aeisxpad ~/cbl]$ 我是不是遗漏了什么?有什么想法吗?
先谢谢大家。
发布于 2020-10-21 09:54:26
用户定义函数和GnuCOBOL的bug解决方案。
用户定义的函数调用没有按照二进制和显示用法正确地封送。值以使用显示的形式传递给pic 9。请尝试将ws-n更改为使用二进制。这将强制调用中的本地数字(然后需要在FATORIAL本身的lk-n链接部分匹配)。
identification division.
program-id. gtc002.
environment division.
configuration section.
repository.
function FATORIAL.
data division.
working-storage section.
*> 77 ws-n pic 9(006) value zeros.
77 ws-n usage binary-long.
procedure division.
main.
display "Entre com um numero inteiro positivo" &
" (ou zero para encerrar):"
accept ws-n from console
if ws-n = zeros
stop run
else
display "O fatorial de " ws-n " e' " FATORIAL(ws-n)
end-if
go to main.和
identification division.
function-id. FATORIAL.
author. Paulo Andre Dias.
date-written. 15/02/2017.
remarks. Calcula o fatorial do numero N informado via argumento.
environment division.
configuration section.
data division.
working-storage section.
77 ws-fatorial-n-menos-1 pic 9(006) value zeros.
linkage section.
*> 01 lk-n pic 9(006).
01 lk-n usage binary-long.
01 lk-fatorial pic 9(006).
procedure division using lk-n returning lk-fatorial.
principal.
if lk-n = zeros
move 1 to lk-fatorial
else
move FATORIAL(lk-n - 1) to ws-fatorial-n-menos-1
compute lk-fatorial = lk-n * ws-fatorial-n-menos-1
end-if
goback.
end function FATORIAL.在这里奉献,
prompt$ cobc -g -xj gtc002.cob FACTORIAL.cob
Entre com um numero inteiro positivo (ou zero para encerrar):
3
O fatorial de +0000000003 e' 000006
Entre com um numero inteiro positivo (ou zero para encerrar):
5
O fatorial de +0000000005 e' 000120
Entre com um numero inteiro positivo (ou zero para encerrar):
7
O fatorial de +0000000007 e' 005040
Entre com um numero inteiro positivo (ou zero para encerrar):
0请原谅稍微重新格式化,以上版本应以固定或自由格式的COBOL编译方式工作。
原来的是将一个ASCII "00005“传递给函数,试图在不正确地将其作为使用二进制(它是GnuCOBOL中的一个bug )封送时,恢复大量的次数。正如@ Sobisch所指出的,这将在某一天得到解决,但目前的一个好的解决办法是用实际使用的二进制参数来编写用户定义的函数,而不是PIC 9 COBOL字段。
对于递归的或非递归的函数,这种工作将保持不变。
对于源中的文字,请使用FUNCTION NUMVAL(123) for 123。源文本文本默认为GnuCOBOL cobc中的"123“PIC 9(使用显示)形式,在当前版本中调用用户定义函数时需要强制使用二进制数字。
https://stackoverflow.com/questions/64146300
复制相似问题