首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GnuCOBOL:尝试创建一个递归的用户定义函数

GnuCOBOL:尝试创建一个递归的用户定义函数
EN

Stack Overflow用户
提问于 2020-09-30 21:56:21
回答 1查看 151关注 0票数 1

我试图用GnuCOBOL 2.0.0创建一个递归的用户定义函数,但是当我试图运行调用程序时,它会崩溃,出现一个“分割失败”错误。

这是一项功能:

代码语言:javascript
复制
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.

这是呼叫者程序:

代码语言:javascript
复制
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.

这就是发生的事情:

代码语言:javascript
复制
[aeisxpad ~/cbl]$ ../bin/gtc002
Entre com um numero inteiro positivo (ou zero para encerrar)::
5
Falha de segmentação
[aeisxpad ~/cbl]$ 

我是不是遗漏了什么?有什么想法吗?

先谢谢大家。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 09:54:26

用户定义函数和GnuCOBOL的bug解决方案。

用户定义的函数调用没有按照二进制和显示用法正确地封送。值以使用显示的形式传递给pic 9。请尝试将ws-n更改为使用二进制。这将强制调用中的本地数字(然后需要在FATORIAL本身的lk-n链接部分匹配)。

代码语言:javascript
复制
   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.

代码语言:javascript
复制
   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.

在这里奉献,

代码语言:javascript
复制
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(使用显示)形式,在当前版本中调用用户定义函数时需要强制使用二进制数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64146300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档