这个C结构如何翻译成Cobol

这个C结构如何翻译成Cobol,c,cobol,C,Cobol,我是Cobol的新手,很难弄清楚如何使用结构。下面的C结构在转换为Cobol时会是什么样子 这些是我拥有的结构: struct dataT { int m; }; struct stack { int top; struct dataT items[STACKSIZE]; } st; 这个语句如何用Cobol表示 st.items[st.top].m 这在很大程度上是暗中摸索,因为我在今天之前从未写过一行COBOL。然而,在中进行了一些2和游戏之后,我想我至少已经捕

我是Cobol的新手,很难弄清楚如何使用结构。下面的C结构在转换为Cobol时会是什么样子

这些是我拥有的结构:

struct dataT
{
    int m;
};

struct stack
{
    int top;
    struct dataT items[STACKSIZE];
} st;
这个语句如何用Cobol表示

st.items[st.top].m

这在很大程度上是暗中摸索,因为我在今天之前从未写过一行COBOL。然而,在中进行了一些2和游戏之后,我想我至少已经捕捉到了代码的味道,如果不是实际的解决方案的话:

IDENTIFICATION DIVISION.
PROGRAM-ID. IDEONE.

ENVIRONMENT DIVISION.

DATA DIVISION.
  WORKING-STORAGE SECTION.
  01 WS-STACK.
    05 WS-TOP PIC 9 VALUE 0.
    05 WS-ITEMS OCCURS 10 TIMES INDEXED BY I.
      10 WS-M PIC 9 VALUE 0.

PROCEDURE DIVISION.
    ADD 1 TO WS-TOP.
    MOVE 9 TO WS-M(WS-TOP).
    ADD 1 TO WS-TOP.
    MOVE 8 to WS-M(WS-TOP).
    DISPLAY "WS-STACK :" WS-STACK.
    DISPLAY "WS-TOP :" WS-TOP.
    DISPLAY "WS-ITEMS[WS-STACK.WS-TOP].M :" WS-M(WS-TOP).
    SUBTRACT 1 FROM WS-TOP.
    DISPLAY "WS-TOP :" WS-TOP.
    DISPLAY "WS-ITEMS[WS-STACK.WS-TOP].M :" WS-M(WS-TOP).
    STOP RUN.
是的,大小硬编码为10(不知道如何在COBOL中使用符号常量),并且
WS-TOP
WS-M
只能存储0到9之间的值

不用说,COBOL和C中的数据类型非常不同。我实际上还没有创建新的堆栈类型;我已经声明了一个包含两个子项的数据项,其中一个子项是一个表,可以存储10个名为
WS-M
的实例。这实际上与写作相同

int main( void )
{
  int top = 10;
  int m[10];

  m[--top] = 9;
  m[--top] = 8;

  printf("top = %d\n", top );
  printf("m[%d] = %d", top, m[top] );
  top++;

  printf("top = %d\n", top );
  printf("m[%d] = %d", top, m[top] );
  return 0;
}
在C语言中,主要区别在于我编写的C代码使堆栈“向下”增长(这更自然)。我花了十分钟的时间来学习COBOL教程,就我所知,COBOL实际上没有一个与
struct
类型等价的类型;即使数据项可以按分层方式分组,也不会创建新的
结构或记录类型。如果我想要多个堆栈,我必须声明多个独立的备份存储和索引变量

我想

我得多读点书


1.在这一天的这一点上,除了眼前的问题,我更愿意做任何事情,我一直对另一半的生活很好奇。另外,我在一个网上银行平台上工作,我知道我们的后端有一半是用COBOL编写的,所以花点时间学习不会有什么坏处。


2.我不能保证本教程的质量;这是我发现的第一本看起来相当完整且易于阅读的书。

您可以这样做:

*> Not a symbolic constant, but if it is never referenced as a 
*> target of a move/compute, the compiler should recognize that.
*> and tune for that.

01 Stack-Size      Pic S9(8) comp-4   Value <<some-number>>.

*> The "comp-4" data type is a twos complement integer, S9(8) makes
*> it a 32-bit word.  Depending upon your compiler, you will sometimes
*> see "binary" or "comp-5"

01 My-Stack.
  02 Stack-Top     Pic S9(8) comp-4   Value 0.
  02 Stack-Items   occurs 0 to <<some-maximum-size>> 
                   depending on Stack-Size.
*>-------*
*> This is your data structure, if you made it a copybook, you would have 
*> the similar effect of having the struct def from the C code. You can
*> use the copy/replacing features if you need to make multipule data
*> items with different names. 
*>
    03 Stack-M     Pic S9(8) comp-5.
*>-------*
一些有用的段落:

 Pop-Stack.
     Move 0 to Stack-M (Stack-Top)
     Subtract 1 from Stack-Top
     Exit.

 Push-Stack.
     Add 1 to Stack-Top
     Move <<whatever value>> to Stack-M (Stack-Top)
     Exit.
Pop堆栈。
将0移动到堆栈-M(堆栈顶部)
从堆栈顶部减去1
出口
推堆栈。
将1添加到堆栈顶部
移动到堆栈-M(堆栈顶部)
出口

最后一行基本上是评估堆栈的顶部,它获取顶部值(st.top),然后从包含整数的items数组中获取。打开Cobol。对不起,我不是在问如何实现堆栈。我想知道语法。比如,在Cobol中该结构和该语句的外观如何,以便我可以自己完成堆栈的其余部分。OpenCOBOL现在是GnuCOBOL。如果你走到这里,在
帮助入门
中提问,这将是一种更好的格式,有助于反复探索你的问题。@Quentin:请记住,这是一个完全由COBOL noob编写的,因此它不能代表正确的COBOL编程。我同意COBOL并没有那么漂亮,但它远没有Perl那么刺眼。我不确定这算不算“堆栈”,或者C中的所有数组都是“在堆栈上”?根据标准,COBOL没有符号常量。有些编译器将其作为扩展,例如级别编号78。将其与条件编译器指令(同样是非标准的)结合起来,我认为这将提供您想要的。我认为堆栈与数组不同?@BillWoodger:请看我的编辑;我充实了C等价物。请注意,在这种情况下,我们使用数组来实现堆栈数据结构。@ BeloGoeGr:这对C或C++程序员来说足够清楚。随着我了解更多信息,我可能会在某个时候再次编辑这个答案。如果您有兴趣,您可以获得一个开源GnuCOBOL编译器,请参阅问题下的SourceForge链接。COMP-4,其中COMP-4是二进制的(不是所有的编译器),如果没有使用假定的小数位数定义,则它只是一个整数。二者的补充取决于实现,尽管我不知道还有一个不是。COMP是另一个二进制代码。所有取决于
都将进行边界检查(如果可用且已启用)。这只是后进先出(OP没有指定)加上一点GIGO,因为没有检查推送/弹出段落。pop不应设置为零,否则暗示为零是无效的实际值。CURR而不是TOP消除了关于为什么顶部在底部的可能混淆…顶部在底部?堆栈项(顶部)的内存地址应始终等于或大于堆栈项(1),底部的内存地址如何?否。我可以将堆栈实现为链表,在运行时获取存储。随着堆栈的增长,内存地址是否总是更高?也许,也许不是,也没关系。无论如何,对于一个C/C++程序员来说,这并不令人困惑。只有我。您的POP必须提供堆栈中的数据,PUSH和POP都必须进行边界检查(尽管链表超过当前分配可能意味着“获取更多存储”)。
 Pop-Stack.
     Move 0 to Stack-M (Stack-Top)
     Subtract 1 from Stack-Top
     Exit.

 Push-Stack.
     Add 1 to Stack-Top
     Move <<whatever value>> to Stack-M (Stack-Top)
     Exit.