2013-05-08 3 views
-1

COBOL에서 문자열의 특정 문자에 액세스하는 방법은 무엇입니까?COBOL에서 문자열의 단일 문자에 액세스하는 방법은 무엇입니까?

예를 들어 문자열이 "work"인 경우 문자에 액세스해야하고 문자열에서 'w'라고 말하면 문자에 저장해야합니다. 나는 문자의 위치가 아니라 일치하는 문자가 필요합니다.

C에서 예를 들어, 우리는

char data[5] = "work";                
    char temp;                   
    temp = data[3];                  

임시 내가에서 동일한 필요 이제 값 'K'

이있을 것이다, (가) 문자열에서 문자 i 번째를 추출하기 위해 다음을 수행합니다 COBOL.

+0

은 절차 부서 및 데이터 부서에서 관련 코드를 보여줍니다. – RBarryYoung

+1

당신이 특정 인물을 말할 때, 당신은 인물의 위치 또는 일치하는 인물을 의미합니까? 즉, 문자열이 "work"이면 "w"가 1을 반환하거나 1을 "w"를 반환하겠습니까? –

답변

5

먼저 알아야 할 점은 배열 인덱스가 C에서 0이고 COBOL에서 1이라는 것입니다.

다음 COBOL과 C는 문자 문자열을 매우 다른 방식으로 표현합니다. C에서 문자열은 대개 문자 배열로 에 저장되며 문자열의 끝은 일반적으로 이진수 0 (null \ 0)을 사용하여 표시됩니다. COBOL 에는 이러한 규칙이 없습니다. 문자열은 지정된 길이의 명명 된 데이터 항목에 저장됩니다. 이러한 항목은 일반적으로 WORKING-STORAGE에서 선언 된 이며 'X'유형의 PICTURE 절이 있습니다 (PICTURE 절에 대해 다른 가능성이 있지만 'X'는 모든 문자 유형을 나타냄). 예 :

01 MY-VARIABLE PIC X(20). 

MY-VARIABLE이라는 작업 저장 변수는 20 자 길이로 선언됩니다. 절차 부분에 다음과 같이 값 을 할당 할 수 있습니다.

MOVE 'work' TO MY-VARIABLE 

그러면 기준 변형으로 알려진 기술하여 다양한 문자열의 문자 (또는 문자열)에 액세스 할 수

DISPLAY MY-VARIABLE(3:1) 

는 MY-VARIABLE의 세 번째 문자를 표시 (1 기반 색인), 이는 'r'입니다. 괄호 안의 첫 번째 숫자 (3) 은 변수 시작 부분에서의 오프셋을 나타내며 두 ​​번째 숫자는 해당 위치 (1)에서 시작하는 문자 수입니다.

MY-VARIABLE을 20 개의 1 문자 셀의 배열로 재정의 할 수있는 REDEFINES와 같은 다른 방법이 있습니다. 이 은 다소 구식 인 메커니즘이므로 문자열의 일부에 액세스하기 위해 참조 수정을 사용하는 것이 좋습니다.

3

다시 답변드립니다. "문자열"에 대해 언급하면서도 데이터의 일부인 "필드"가 무엇인지에 대해 이야기하고 있다고 생각합니다.

01 a-piece-of-data. 
    05 first-two-bytes-of-data PIC XX. 
    05 third-byte-of-data  PIC X. 
    05 fourth-byte-of-data  PIC X. 

a-piece-of-data는 4 바이트 길이의 "그룹 항목"입니다. "하위"정의를 사용하면 4 바이트 내에서 개별 바이트에 액세스 할 수 있습니다.

01 a-piece-of-data    PIC X(4). 
01 FILLER REDEFINES a-piece-of-data. 
    05 first-two-bytes-of-data PIC XX. 
    05 third-byte-of-data  PIC X. 
    05 fourth-byte-of-data  PIC X. 

은 그것은 "첨자"을 수행 할 수 있습니다 : 이제

01 a-piece-of-data. 
    05 FILLER OCCURS 4 TIMES. 
     10 a-byte-in-the-piece-of-data PIC X. 

, 데이터의

a-byte-in-the-piece-of-data (3) 

참조 세 번째 바이트

그것은이 방법을 수행 할 수 있습니다.

그림과 같이 리터럴을 사용하거나 데이터 이름 (일반적인 방식으로 사용자가 정의한 이름과 저장소, 수치가되어야하며 이진수가 가장 좋음) 또는 인덱스 이름 (INDEXED BY 여기서 이름은 정의하지만 컴파일러는 저장소를 정의합니다.

NealB에 표시된 것처럼 참조 수정을 통해 수행 할 수도 있습니다.

나를 위해, 선택은 종종 "다음 사람에게 가장 명확한가?"로 내려옵니다. 과 동일

01 WHAREHOUSE-REF. 
    05 WHAREHOUSE-CODE PIC XX. 
     88 WHAREHOUSE-HAS-LIFT VALUE "LN" "CV". 
    05 WHAREHOUSE-FLOOR PIC X. 
     88 WHAREHOUSE-UPPER-FLOOR VALUE "1" "2". 
    05 WHAREHOUSE-BAY  PIC X. 

01 W-LIFT-USAGE   PIC X. 
    88 W-LIFT-USAGE-NONE VALUE ZERO. 

IF WHAREHOUSE-HAS-LIFT 
AND WHAREHOUSE-UPPER-FLOOR 
    MOVE WHAREHOUSE-FLOOR TO W-LIFT-USAGE 
ELSE 
    SET W-LIFT-USAGE-NONE TO TRUE 
END-IF 
PERFORM CALC-ROBOT-TIME-TO-BAY 

(또는 그 것이다? 당신은 항상 수동의 모든 시간을 확인할 수) :

01 VAR1 PIC X(4). 
01 VAR2 PIC X. 

IF VAR1 (1:2) = "LN" OR "CV" 
AND VAR1 (3:1) = "1" OR "2" 
    MOVE VAR1 (3:1) TO VAR2 (1:1) 
ELSE 
    MOVE ZERO TO VAR2 (1:1) 
END-IF 
PERFORM CALC-ROUTINE THROUGH CALC-ROUTINE-EXIT 

PS합니다. VAR2에 대해 알고 있지만, 경험상 참조 편집을 사용하는 경험이없는 사람들이 얼마나 많은 코드를 작성 했는가? 또한 VAR2 (1 :)가 표시되는 반면 일반 VAR2 만 있으면됩니다. 예, 선택한 이름은 참조 수정 및 경험이없는 사람과 비슷한 것으로 보이는 이름 유형입니다.

+0

W-LIFT-USAGE-NONE TRUE를 설정하면 정확히 0에서 VAR2 (1 : 1)로 이동합니까? 왜 VAR2 이후에 (1 : 1) 필요가 있습니까? VAR2에만 0을 사용할 수 있습니까? – user1169587

+0

예, 정확히 말하면, SET를 조건 이름에 사용하면 100 % 정확히 무슨 일이 일어나는지 알 수 있습니다. 길이가 1 인 PIC X에 대한 (1 : 1)은 물론 불필요 합니다만, 엄격히 말하면, 모든 참조 변경은 불필요하므로 그것을 보지 않을 것을 기대하지 마십시오. 참조 수정을 사용하는 누군가가 최선의 방법으로 그것을 사용하지 않을 것인가? 따라서 VAR (1 : 1)은 1 바이트이고, VAR (1 : 7)은 7 바이트이며, 누군가 필드를 8 바이트 길이로 변경하면 어떤 일이 발생합니까? –

관련 문제