0

テキスト ファイルから受け取ったパターンを COBOL のテーブルに格納しようとしています。そのために READ.. INTO.. ステートメントを使用しています。

WORKING-STORAGE SECTION.
   01 ROWCOL.
        03 NROW     PIC 9(3).
        03 NCOL     PIC 9(2).
   01 PATT-INIT.
        03 ROW PIC X OCCURS 1 TO 80 TIMES
              DEPENDING ON NCOL.
   01 PATT.
        03 COL OCCURS 1 TO 80 TIMES
              DEPENDING ON NCOL.
              05 ROW OCCURS 1 TO 100 TIMES
                    DEPENDING ON NROW PIC X.

   PROCEDURE DIVISION.
   MAIN-PARAGRAPH.
        OPEN INPUT INPUT-FILE.
        READ INPUT-FILE INTO ROWCOL.
        PERFORM READ-PATTERN
        STOP RUN.

   READ-PATTERN.
        READ INPUT-FILE INTO PATT-INIT(1:NCOL).

input.txt のパターンは次のようになります。

011000
001010
010100

これに関する問題は、PATT-INIT 配列を PATT 2d-配列に配置する方法がわからないということです。私は PATT-INIT 配列を使用して、各行のパターンを行ごとに受け取ります。次に、インデックス番号で各番号にアクセスできるように、それを PATT 2d 配列に格納しようとしています。たとえば、PATT(1:2) は 1 を返します。

これを実装する方法についていくつかの指針を教えてください。READ.. INTO.. が進むべき道でない場合は、他の提案を喜んで受け取ります。

4

3 に答える 3

2

あなたの問題の一部は、(1:NCOL) のようなものが 1 つのことをしていると思っているのに、実際にはまったく別のことを意味していると思います表記は「参照改変」を示します。おそらく、通常の添字付け、または固定長 1 の可変開始点からの「参照変更」を期待しているでしょう。

01  a-nicely-name-table.
    05  FILLER OCCURS 80 TIMES.
        10  a-nicely-named-row-entry.
            15  FILLER OCCURS 6 TIMES.
                20  a-nicely-named-column-entry PIC X.

READ からのデータは a-nicely-name-row-entry ( subscripted ) に入ります。すべてがそこにあると、a-nicely-named-column-entry ( a-row-subcript, a-column-subscript ) によって特定の行の特定の列を参照できます。

「:」がない場合、これは添え字であり、「参照の変更」ではないことに注意してください。コンマはオプションです。

テーブルに入れる行数の境界の「外側」に行かないようにする必要があります。また、入力データでテーブルを「オーバーフロー」させないようにする必要があります。

添え字付けにインデックスを使用できます (OCCURS 定義の INDEXED BY)。あなたが何を達成しようとしているのかが不明であるため、私は例にありません。

于 2013-02-10T10:12:04.073 に答える
1

あなたの質問を正しく理解していれば、いくつかの問題があるかもしれません。Bill an Bruce は、添字と参照の変更を混同しているようだと指摘しました。基本的に次のようなもの:

  DISPLAY PATT-INT (1:3)

の最初の 3 文字が表示されますPATT-INT。参考改造です。その間

  DISPLAY ROW OF PATT (1, 3)

COL表の1、3ROWに文字が表示されPATTます。ここでは「最下位」レベルの要素名を参照する必要があることに注意してください。そのため、一部のデータ構造の名前を変更すると、「追跡」が少し簡単になります。

他の問題は、行と列の間の混乱かもしれません...

あなたが与えたinput-txtファイルには3行のデータ(行)があります。各行には 6 文字 (列) があります。あなたの宣言PATT-INITは、時代があるのでそれを強化しているようOCCURS NCOLです。1 行のデータを読み取ると、その行に対して 6 列が取得されます。ただし、PATT テーブルはこれを横にひっくり返します。これは、Column then Row レイアウトで宣言されています。input.txtこのレイアウトは、テーブル宣言がファイル レイアウトに従っていないため、そこから直接読み取ることができないことを意味します。

その問題に対する2つの解決策。

これは、あなたが目指して取り組んでいたと思われるものです。

各行を読み取り、同じ行に対して6 列になるようにinput.txt格納します。たとえば、input: の最初の行は6 列 1 行に格納されます。注: '1' の値を持つ必要があることを示しました - ここでは '1' になります。PATTPATT011000PATT (1, 1)PATT (6, 1)ROW OF PATT (1, 2)ROW OF PATT (2, 1)

それはさておき、入力の 1 行を 1 次元配列 ( ) に読み取ってから、それをテーブルPATT-INITに再分配することができます。PATTプログラムの概要は次のとおりです。

 MAIN-PARAGRAPH.
     OPEN INPUT INPUT-FILE
     READ INPUT-FILE INTO ROWCOL
     PERFORM VARYING WS-R FROM 1 BY 1
               UNTIL WS-R > NROW
        PERFORM READ-1-ROW
     END-PERFORM
     CLOSE INPUT-FILE
     .
 READ-1-ROW.
     READ INPUT-FILE INTO PATT-INIT (1:NCOL)
     PERFORM VARYING WS-C FROM 1 BY 1
               UNTIL WS-C > NCOL
        MOVE ROW OF PATT-INIT (WS-C) TO ROW OF PATT (WS-C, WS-R)
     END-PERFORM
     .

他の解決策は、次のように再定義PATTされる可能性があります

01 PATT.
     03 ROW OCCURS 1 TO 100 TIMES
           DEPENDING ON NROW.
           05 COL OCCURS 1 TO 80 TIMES
                 DEPENDING ON NCOL PIC X.

これで、次のように簡単に読むことができます。

 MAIN-PARAGRAPH.
     OPEN INPUT INPUT-FILE
     READ INPUT-FILE INTO ROWCOL
     PERFORM VARYING WS-R FROM 1 BY 1
               UNTIL WS-R > NROW
        READ INPUT-FILE INTO ROW (WS-R) (1:NCOL)
     END-PERFORM
     CLOSE INPUT-FILE

PATT-INIT参照されなくなったため、作業用ストレージを削除できます。

注: このレイアウトでは COL OF PATT (1, 2)= '1'

上記を適切なデータ編集、境界チェック、およびFILE-STATUS各 I/O 後のチェックで具体化して、プログラムを完成させます。

于 2013-02-11T21:50:35.583 に答える
0

問題は、PATT-INIT(1:NCOL)を使用した読み取りではありません。これは 参照変更と呼ばれます。

Cobol は行またはレコード指向の IO を行います。それで

  READ INPUT-FILE INTO PATT-INIT

おそらくあなたが望むものです。配列要素にアクセスするには、(i:j) ではなく (i,j) を使用します。

于 2013-02-10T22:41:25.673 に答える