2010-01-25 4 views
3

M과 N 모두 가변 길이의 Cobol에서 2 차원 MxN 배열을 정의하는 방법은 무엇입니까? 사용자가 정의하려고하는 어떤Cobol의 2 차원 가변 길이 배열

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE 
+1

코볼은 오래된 언어입니다. 그러나 동적 배열에 사용되는 메모리 할당 트릭없이 가변 길이 배열/테이블을 정의 할 수 있습니다 (NealB의 회신 참조). –

답변

5

는 구조 (복합 ODO) "컴플렉스에 따라 발생합니다"입니다 :

는 여기에 또 다른 내부 변수 배열을 할 때 내가 순 Express에서 얻을 메시지입니다. 테이블 rectaguar 여기서 다음

당신은 복합 ODO을 정의 할 수있다 :

 
     01 TABLE-REC.
05 M PIC S9(4) BINARY. 05 N PIC S9(4) BINARY. 05 ROWS OCCURS 10 TIMES DEPENDING ON M. 10 COLUMNS OCCURS 10 TIMES DEPENDING ON N. 20 CELL PIC X(1).

트릭는 N 선언 테이블의 가변 부분 내에서 발생할 수 있다는 것이다. 예를 들어, 다음과 같은 선언 : 선언이 각 행은 컬럼의 다른 번호를 포함 할 수 있음을 의미하기 때문에

 
     01 TABLE-REC. 
      05 M    PIC S9(4) BINARY. 
      05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M. 
       10 N   PIC S9(4) BINARY 
       10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N. 
        20 CELL PIC X(1). 

당신에게 오류를 줄 것이다 (예를하지 직사각형 테이블.).

일반적으로 COBOL 의 ODO 구조가 실제로 "구매"하는 것과 관련하여 많은 혼란이 있습니다. 일반적으로 데이터 저장 구조의 크기를 동적으로 조정할 수 있기 때문에 메모리를 절약하기 위해 을 사용할 수 있다는 공통적 인 오류가 있습니다. ODOC가 LOCAL 또는 WORKING STORAGE에서 선언되면이 값은 입니다. 코볼 컴파일러는 에게 가장 큰 M의 가치와 N.은 "구매"무엇

을 수용하기에 충분한 메모리를 할당 할 것이다 당신은 물리적으로 메모리에 데이터를 를 구성하는 메커니즘입니다. 다음의 프로그램을보고 그것을 표시 무엇 :

 
     IDENTIFICATION DIVISION. 
     PROGRAM-ID. EXODO. 
     DATA DIVISION. 
     WORKING-STORAGE SECTION. 
     77 I     PIC S9(4) BINARY. 
     77 J     PIC S9(4) BINARY. 
     01 DIMENSIONS. 
      05 M    PIC S9(4) BINARY VALUE 6. 
      05 N    PIC S9(4) BINARY VALUE 7. 
     01 TABLE-REC-1. 
      05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M. 
       10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N. 
        20 CELL PIC X(1). 
     01 TABLE-REC-2. 
      05 ROWS OCCURS 10 TIMES. 
       10 COLUMNS OCCURS 10 TIMES. 
        20 CELL PIC X(1). 
     PROCEDURE DIVISION. 
      PERFORM VARYING I FROM 1 BY 1 UNTIL I > M 
       PERFORM VARYING J FROM 1 BY 1 UNTIL J > N 
       MOVE 'X' TO CELL OF TABLE-REC-1 (I J) 
       MOVE 'X' TO CELL OF TABLE-REC-2 (I J) 
       END-PERFORM 
      END-PERFORM 
      DISPLAY TABLE-REC-1 
      DISPLAY TABLE-REC-2 
      GOBACK 
      . 

표시 다음 ODO 버전이 잘 에 6 X 7 매트릭스를 compated 모든 데이터를 가지고

 
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
    XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX 

공지 사항 고정 테이블 동안 버전은 각각의 행을 최대 OCCURS 행으로 채우기 위해 "구멍"이있는 10 x 10 행렬을 유지합니다. 이 구별이 중요 할 때가 있습니다 (대개는 그렇지 않습니다).

당신이 익숙하지 않은 넷 익스프레스를 사용하고있는 것을 볼 수 있습니다. 따라서 은 다음 부분을 작동시키기 위해 주위를 돌아 다닐 필요가 있습니다. 당신은 다음과 같은 작업을 수행 할 수 Z/OS 용 IBM 기업 COBOL로 :

은 그냥 레코드 레이아웃입니다, 그래서 메모리 가 할당되지 않은 프로그램 LINKAGE SECTION에 ODO을 정의합니다. 그런 다음 테이블의 실제 크기 (즉, M 회 N 요소)의 실제 크기에 대해 충분한 메모리를 동적으로 할당 할 수 있습니다. 두 가지를 SET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address 과 같은 것으로 을 사용하여 연결하십시오 (CICS에서는 GETMAIN을 사용하고 일괄 처리에서는 CEEGTST를 사용하여 메모리를 확보). 최소 공간을 사용하는 동적 데이터 구조 이 있으며 위에 표시된 레이아웃 정보 때문에 이 계속 올바르게 인덱싱됩니다.

COBOL에서 ODO를 사용하는 (또는 사용하지 않는) 다른 방법이 있지만 은 내가 알고있는 가장 일반적인 방법입니다.

+0

NealB에 대한 설명에 감사드립니다. 연구에 이어 Net Express는 중첩 된 요소가 발생하는 구조를 컴파일하기 위해 프로젝트에서 컴파일러 지시문 (ODOSLIDE)을 요구합니다. –

1

너는 너가 가고 싶은 차원의 각 수준에 OCCURS.. DEPENDING ON을 정의해서 다차원 가변 길이 배열을 정의 할 수 있는다.