Recursion GnuCOBOL:尝试创建递归用户定义函数

Recursion GnuCOBOL:尝试创建递归用户定义函数,recursion,user-defined-functions,cobol,gnucobol,Recursion,User Defined Functions,Cobol,Gnucobol,我试图用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.

我试图用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]$ 
我错过什么了吗?有什么想法吗


提前感谢大家。

针对用户定义函数和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.

在这里给予

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中的一个错误)。正如@Simon Sobisch所指出的,这一问题总有一天会得到解决,但目前一个合理的解决办法是使用实际使用的二进制参数来编码用户定义的函数,而不是使用PIC 9 COBOL字段

这种解决方法适用于递归或非递归函数


对于源代码中的文本,请使用123的
函数NUMVAL(123)
。在GnuCOBOL cobc中,源文本文本默认为“123”PIC 9(用法显示)形式,在当前版本中调用用户定义函数时,需要强制使用二进制数字。

解决用户定义函数和GnuCOBOL的错误

用户定义的函数调用没有按照二进制和显示用法进行正确封送。值通过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.

在这里给予

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中的一个错误)。正如@Simon Sobisch所指出的,这一问题总有一天会得到解决,但目前一个合理的解决办法是使用实际使用的二进制参数来编码用户定义的函数,而不是使用PIC 9 COBOL字段

这种解决方法适用于递归或非递归函数


对于源代码中的文本,使用123的
函数NUMVAL(123)
。源文本文本默认为“123”PIC 9(用法显示)在当前版本中调用用户定义函数时,您需要强制使用二进制数字。

您可能希望将
ws-fatorial-n-menos-1
放在
LOCAL-STORAGE部分
,但问题是一个老错误。GnuCOBOL 2.0非常过时,最好将其更新为类似于3.1rc2的版本en此功能的测试用例被“跳过”,因为它在某些环境中工作,但在其他环境中不工作[“已知问题”]。谢谢你,Simon。你知道3.1版编译的这个函数在Centos下是否可以工作吗?它在codingground:上与GC 2.2发生故障,在Debian x86_64下也与3.1 dev发生故障,但在ARM上通过-这就是为什么仍然跳过测试(既不保证通过也不保证失败)…它将被解决,但到目前为止时间还没有到来…您可能希望将
ws-fatorial-n-menos-1
放在
LOCAL-STORAGE部分
,但问题是一个老错误。GnuCOBOL 2.0非常过时,最好将其更新为类似于3.1 RC2的版本。但即使如此,此功能的测试用例仍被“跳过”因为它在某些环境中工作,但在其他环境中不工作[“已知问题”]。谢谢你,Simon。你知道3.1版编译的这个函数在Centos下是否可以工作吗?它在codingground:上与GC 2.2隔离故障,在Debian x86_64下与3.1 dev隔离故障,但它在ARM上传递-这就是仍然跳过测试的原因(既不保证通过也不保证失败)…它将得到解决,但到目前为止,时间还没有到来。。。