데이터 초기화
EGL은 다음과 같이 데이터 초기화를 처리합니다.
- 일반적으로 다음 경우에 초기자(initializer)(등호
뒤에 리터럴이 표시됨)를 코드화할 수 있습니다.
- 구조화 레코드 파트를 정의하는 경우(최하위 레벨
필드용):
Record ExampleRecord type basicRecord 10 myField CHAR(5); 20 myField01 CHAR(1) = "1"; 20 myField02 CHAR(1) = "2"; 20 myArray01 CHAR(1)[3] = ["a", "b", "c"]; // the following entry assigns "z" to the first element // and (in Java code) blanks to the rest 20 myArray02 CHAR(1)[3] = ["z"]; end이 규칙은 양식 필드에도 적용됩니다. DataTable에서는 초기자(initializer)를 지정할 수 없습니다.
- 기본 데이터 유형을 기반으로 변수를 선언하는 경우:
Record ExampleRecord type basicRecord myRecField INT = 2; end Program myProgram (myField03 INT = 3) myField04 STRING = "EGL"; function main() // myRecord.myRecField = 2 myRecord ExampleRecord; endend - 다른 레코드를 재정의하는 레코드를 정의하는 경우(초기자(initializer)는
선언 시 아무 영향도 주지 않지만 사용자 코드가 set record initial 문을
호출하는 경우에 사용됨):
Record partA 10 aa char(4) = "abcd"; end Record partB 10 bb char(4) = "1234"; end Program Example A partA; B partB { redefines="A" }; function main() // each of the next statements writes "abcd" writeStdOut( A.aa ); writeStdOut( B.bb ); // sets the memory area to reflect the definition of record partB set B initial; // each of the next statements writes "1234" writeStdOut( A.aa ); writeStdOut( B.bb ); end end
- 구조화 레코드 파트를 정의하는 경우(최하위 레벨
필드용):
- 또한 EGL은 다음과 같은 경우에 사전설정 값을 가진 메모리를
초기화합니다(해당 값에 대해서는 나중에 설명함):
- 사용자의 논리가 set 문의 일부 변형을 호출합니다. set의 내용을 참조하십시오.
- 변수의 초기화됨 특성을 YES로 설정합니다. 이 특성은 레코드 필드의 특성이 아니라 변수의 특성이며 대부분 더 이상 사용되지 않습니다.
- 라이브러리, 서비스, 모든 핸들러 유형을 비롯한 Java™의 파트를 생성합니다.
구조화 레코드에서는 최하위 레벨 구조 필드만 초기화됩니다. 다음 예제를 검토합니다.
hexField의 메모리 영역은 HEX 변수에 적합하게 2진 0으로 초기화됩니다. remainder 필드는 공백으로 초기화됩니다. HEX 문자 두 개가 1바이트가 되므로 HEX(16) 변수에는 최대 8바이트만 필요합니다.Record ExampleRecord 10 charField CHAR(24); 15 hexField HEX(16); 15 remainder CHAR(16); end배열의 경우 배열의 각 멤버는 개별적으로 초기화됩니다.
프로그램 또는 함수 인수로 수신되는 레코드 또는 필드는 자동으로 초기화되지 않습니다.
널 입력 가능 변수는 특수한 경우입니다. 유형 확장 문자 "?"로 작성된 변수는 널로 초기화됩니다.
널 입력 가능 변수는 특수한 경우입니다. 유형 확장 문자 "?"로 작성된 변수는 널로 초기화됩니다. i4glItemsNullable 특성으로 제어되는 변수는 다른 초기값 세트를 갖습니다. i4glItemsNullable을 참조하십시오.
다음 표에서는 다양한 유형의 자동 초기화 값에 대해 자세히 설명합니다.표 1. 초기화 중에 자동으로 지정되는 값 유형 초기화 값 ANY 널 BIN(및 정수 유형), HEX, FLOAT, SMALLFLOAT 2진 0 BLOB, CLOB lobLib.freeBlob() 또는 lobLib.freeClob()을 사용하여 재설정 BOOLEAN False CHAR, MBCHAR 1바이트 공백 DATE, TIME, TIMESTAMP 시스템 시계의 값(TIMESTAMP의 경우 마스크에 필요한 바이트 수) DBCHAR 2바이트 공백 DECIMAL, MONEY, NUM, NUMC, PACF 숫자 0 INTERVAL 더하기 부호 뒤에 오는 숫자 0(마스크에 필요한 바이트 수의 경우) STRING ""(널 문자열) UNICODE 유니코드 공백(각각은 16진 0020임)
참고: 라이브러리 간 순환 종속성은 초기화 중에 문제를
일으킵니다. 다음 예제와 같이 두 개의 라이브러리에
초기값이 다른 라이브러리의 변수에 따라 다른 변수가
있는 경우 종속성이 순환됩니다.
library lib1
a int = 1;
b int = lib2.c;
end
library lib2
c int = 2;
d int = lib1.a;
end
프로그램이 lib1 또는 lib2를 사용하려고 하면 EGL이 예외를 처리합니다.
호환성
| 플랫폼 | 문제 |
|---|---|
| COBOL 생성 | EGL 생성 COBOL 프로그램은 모든 레코드를 초기화합니다. 레코드 내의 필드는 COBOL 데이터 유형을 기반으로 초기화되며 그 후에 위의 표에 설명된 대로 EGL 유형에 따라 변수가 초기화되고 COBOL INITIALIZE 문을 오버라이드합니다. 참고: NUM 유형의 변수를 CHAR 유형의 변수와
비교하는 COBOL 프로그램을 생성하는 경우 코드가 필드를
초기화하는지 확인하십시오. 그렇지 않으면 비교로 인해 프로그램이
실패하고 이상 종료 메시지가 표시될 수 있습니다. 이 경우 예외 핸들링 코드가
실행되지 않습니다. 유사한 COBOL 특정 경고가 로컬 레코드의
필드에 적용됩니다.
|
| JavaScript 생성 | 다음 유형은 지원되지 않습니다. ArrayDictionary, BIN(소수 자리가 있음), BLOB, CHAR, CLOB, DBCHAR, HEX, INTERVAL, MBCHAR, NUMC, STRING(크기 제한이 있음), PACF, UNICODE, 구조화 레코드 파트. |