我如何循环一个集合?
我正在试用版本的Fujitsu/Alchemy编译器,并且得到了供应商的缓慢而糟糕的支持。
我基本上希望将一个列表从C#传递给COBOL,然后让COBOL使用它并可能更新它。
在C#中,迭代集合的正常方法是使用"foreach“构造。
但是,C# "foreach“构造是以下快捷方式:
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编写它,如果您可以帮助我声明这个类的话:
System.Collections.Generic.List<IDMSMapField>.Enumerator“枚举器”结构是记录在微软MSDN网站上。
它告诉我们,“枚举器”是一个结构,而不是一个类!
从手册"CreatingCOBOLfromDotnetFrameworkDox.pdf“中可以看出,结构被定义为COBOL存储库中的类。
手册中的示例:
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.
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‘无法解析。
错误JMN1795I-S:命名引用“System.Collections.Generic.List.Enumerator”无法解析。
错误JMN1795I-S:命名引用“System.Collections.Generic.List.Enumerator”无法解析。
另一种选择是把它当作数组来处理,但是我也被困在这上面了。
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)视为子字符串操作。
发布于 2011-06-08 22:34:38
花了一段时间,但这是一个完整的工作样本。还有一些其他技巧可以进入属性,并将属性值(如Count )移动到一个COBOL变量中,并使用适当的USAGE子句。“展开”关键字(在存储库中)是解决方案的另一个关键部分。
在我的实际程序中,我将收到链接部分中的列表,我将有一个更复杂对象的列表.但是,示例代码是一个更简单的场景,独立运行并运行“原样”。
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.发布于 2011-06-10 21:22:09
使用Micro的.NET实现,代码可以使用一个“执行变化通过”扩展来遍历列表。
因此,修改后的版本是:
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.接下来,您可以使用内联声明,而不是使用存储库语法和展开,例如:
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上这样做,不管使用的是哪种产品。好好享受..。
https://stackoverflow.com/questions/6272349
复制相似问题