首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fujitsu COBOL中的Systems.Collections.List迭代

Fujitsu COBOL中的Systems.Collections.List迭代
EN

Stack Overflow用户
提问于 2011-06-07 22:27:35
回答 2查看 1.1K关注 0票数 4

我如何循环一个集合?

我正在试用版本的Fujitsu/Alchemy编译器,并且得到了供应商的缓慢而糟糕的支持。

我基本上希望将一个列表从C#传递给COBOL,然后让COBOL使用它并可能更新它。

在C#中,迭代集合的正常方法是使用"foreach“构造。

但是,C# "foreach“构造是以下快捷方式:

代码语言:javascript
复制
private static void test1()
{
    List<IDMSMapField> list1 = new List<IDMSMapField>();
    int listSize = list1.Count;
    // was just checking exact variablename and case here to copy into COBOL code.
    int itemNumber = 0;

    System.Collections.Generic.List<IDMSMapField>.Enumerator enumerator1 = list1.GetEnumerator();

    while (enumerator1.MoveNext())
    {
        Console.Write("Okay" + enumerator1.Current);
    }
}

我可以用COBOL编写它,如果您可以帮助我声明这个类的话:

代码语言:javascript
复制
System.Collections.Generic.List<IDMSMapField>.Enumerator

“枚举器”结构是记录在微软MSDN网站上

它告诉我们,“枚举器”是一个结构,而不是一个类!

从手册"CreatingCOBOLfromDotnetFrameworkDox.pdf“中可以看出,结构被定义为COBOL存储库中的类。

手册中的示例:

代码语言:javascript
复制
Define specifiers for structure in REPOSITORY, and any struct members:
CLASS STRUCT-name AS "struct-namespace"
PROPERTY PROP-struct-member AS "external-property-name"
Handle structures like classes. E.g. object to store a struct instance:
01 struct-object OBJECT REFERENCE STRUCT-name.

下面,我重复一些我尝试过的变体,因为“无法解决”错误,这些变体都无法编译。如果你能教我如何正确地声明这一点,我想我们可以向前迈进。

1.

代码语言:javascript
复制
    REPOSITORY.
           CLASS  CLASS-LIST         AS "System.Collections.Generic.List<>"
           CLASS  STRUCT-Enumerator  AS "System.Collections.Generic.List<>.Enumerator"
           .

第二行出错:

错误JMN1795I-S:命名引用'System.Collections.Generic.List<>.Enumerator‘无法解析。

  1. 与此完全相同的错误: 储存库。类类-列表为"System.Collections.Generic.List<>“类结构-枚举数为"System.Collections.Generic.List.Enumerator”。

错误JMN1795I-S:命名引用“System.Collections.Generic.List.Enumerator”无法解析。

  1. 同样的错误: 储存库。类类-列表为"System.Collections.Generic.List<>“类结构-枚举数为"System.Collections.Generic.List.Enumerator”。

错误JMN1795I-S:命名引用“System.Collections.Generic.List.Enumerator”无法解析。

另一种选择是把它当作数组来处理,但是我也被困在这上面了。

代码语言:javascript
复制
REPOSITORY.
    CLASS LIST-IDMSMapField    AS "System.Collections.Generic.List<>[]"
    CLASS CLASS-IDMSMapField   AS "Lightyear.ERCB.IDMSDC.IDMSMapField"
    CLASS CLASS-LIST-IDMSMapField EXPANDS LIST-IDMSMapField USING CLASS-IDMSMapField.

METHOD-ID. TW1DR4000-PF06 AS "TW1DR4000_PF06".
DATA DIVISION.
WORKING-STORAGE SECTION.

01 MapFieldItem USAGE OBJECT REFERENCE CLASS-IDMSMapField.

LINKAGE SECTION.

01 MapFieldList USAGE OBJECT REFERENCE CLASS-LIST-IDMSMapField.

PROCEDURE DIVISION...
...
SET MapFieldItem TO MapFieldList(1).

错误JMN2671I-S:':‘必须在引用修饰符中指定。“:”是假定的。

我认为编译器可能将(1)视为子字符串操作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 22:34:38

花了一段时间,但这是一个完整的工作样本。还有一些其他技巧可以进入属性,并将属性值(如Count )移动到一个COBOL变量中,并使用适当的USAGE子句。“展开”关键字(在存储库中)是解决方案的另一个关键部分。

在我的实际程序中,我将收到链接部分中的列表,我将有一个更复杂对象的列表.但是,示例代码是一个更简单的场景,独立运行并运行“原样”。

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID. MAIN AS "COBOLEnumerationSample.Main".
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SPECIAL-NAMES.
   REPOSITORY.
       CLASS List        AS "System.Collections.Generic.List<>"
       CLASS SysString   AS "System.String"
       CLASS SysBoolean  AS "System.Boolean" 
       CLASS ListString EXPANDS List USING SysString
       CLASS Enumerator  AS "System.Collections.Generic.List<>+Enumerator"
       CLASS StringEnumerator EXPANDS Enumerator USING SysString
       PROPERTY PROP-Count   AS "Count"      
       PROPERTY PROP-Current AS "Current"
       .       
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 myList              OBJECT REFERENCE ListString.
   01 myEnum              OBJECT REFERENCE StringEnumerator.   
   01 myBooleanEnumResult OBJECT REFERENCE SysBoolean. 
   01 myDotNetString      OBJECT REFERENCE SysString.  
   01 myLoopCounter       PIC 9(4)  value zero. 
   01 myCobolCount        PIC S9(9) COMP-5 VALUE ZERO.
   01 myCobolString       PIC X(30) value spaces. 
   01 YN-END-LOOP         PIC X     value "N". 
   01 WS-ACCEPT-INPUT     PIC X(80) value spaces. 

   PROCEDURE DIVISION.
   1000-START.
       INVOKE ListString "NEW" returning myList.
       INVOKE myList "Add" using "Apples"
       INVOKE myList "Add" using "Bananas"
       INVOKE myList "Add" using "Orange"


       SET myCobolCount to PROP-Count of myList 
       DISPLAY "Size of MyList = " myCobolCount

       INVOKE myList "GetEnumerator" returning myEnum.


       PERFORM UNTIL YN-END-LOOP = "Y" 
             INVOKE myEnum "MoveNext" returning myBooleanEnumResult  
  * How to test for Boolean, True = B'1' and False = B'0' 
             IF myBooleanEnumResult = B'0' 
                MOVE "Y" TO YN-END-LOOP 
             ELSE       
                SET myDotNetString TO PROP-Current of myEnum 
                ADD 1 TO myLoopCounter
                SET myCobolString to myDotNetString 
                DISPLAY myLoopCounter " " myCobolString 
             END-IF    

       END-PERFORM 

       DISPLAY "END OF PROGRAM - PRESS ENTER TO END" 
       ACCEPT WS-ACCEPT-INPUT
       .

   END PROGRAM MAIN.
票数 3
EN

Stack Overflow用户

发布于 2011-06-10 21:22:09

使用Micro的.NET实现,代码可以使用一个“执行变化通过”扩展来遍历列表。

因此,修改后的版本是:

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID. MAIN AS "COBOLEnumerationSample.Main".
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SPECIAL-NAMES.
   REPOSITORY.
       CLASS List        AS "System.Collections.Generic.List"
       CLASS SysString   AS "System.String"
       CLASS SysBoolean  AS "System.Boolean"
       CLASS ListString EXPANDS List USING SysString
       PROPERTY PROP-Count   AS "Count"
       PROPERTY PROP-Current AS "Current"
       .
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 myList              OBJECT REFERENCE ListString.
   01 myLoopCounter       PIC 9(4)  value zero.
   01 myCobolCount        PIC S9(9) COMP-5 VALUE ZERO.
   01 myCobolString       PIC X(30) value spaces.
   01 WS-ACCEPT-INPUT     PIC X(80) value spaces.

   PROCEDURE DIVISION.
   1000-START.
       INVOKE ListString "NEW" returning myList.
       INVOKE myList "Add" using "Apples"
       INVOKE myList "Add" using "Bananas"
       INVOKE myList "Add" using "Orange"

       SET myCobolCount to PROP-Count of myList
       DISPLAY "Size of MyList = " myCobolCount

       move 0 to myLoopCounter
       PERFORM varying myCobolString through myList
           DISPLAY myLoopCounter " " myCobolString
           ADD 1 to myLoopCounter
       END-PERFORM

       DISPLAY "END OF PROGRAM - PRESS ENTER TO END"
       ACCEPT WS-ACCEPT-INPUT
       .

   END PROGRAM MAIN.

接下来,您可以使用内联声明,而不是使用存储库语法和展开,例如:

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID. MAIN AS "COBOLEnumerationSample.Main".
   WORKING-STORAGE SECTION.
   01 myList         type "System.Collections.Generic.List"[string].
   01 myLoopCounter   PIC 9(4)  value zero.
   01 myCobolCount    PIC S9(9) COMP-5 VALUE ZERO.
   01 myCobolString   PIC X(30) value spaces.
   01 WS-ACCEPT-INPUT PIC X(80) value spaces.

   PROCEDURE DIVISION.
   1000-START.
       INVOKE type "System.Collections.Generic.List"[string]::"NEW"
             returning myList
       INVOKE myList "Add" using "Apples"
       INVOKE myList "Add" using "Bananas"
       INVOKE myList "Add" using "Orange"


       SET myCobolCount TO myList::"Count"
       DISPLAY "Size of MyList = " myCobolCount

       MOVE 0 TO myLoopCounter
       PERFORM varying myCobolString through myList
           DISPLAY myLoopCounter " " myCobolString
           ADD 1 TO myLoopCounter
       END-PERFORM

       DISPLAY "END OF PROGRAM - PRESS ENTER TO END"
       ACCEPT WS-ACCEPT-INPUT
       .

   END PROGRAM MAIN.

不管怎么说,我很喜欢我们可以在COBOL上这样做,不管使用的是哪种产品。好好享受..。

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

https://stackoverflow.com/questions/6272349

复制
相关文章

相似问题

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