728x90
반응형
문제점 및 증상
다음과 같이 작성 후, 컴파일 시 오류가 발생합니다.
const
// SMA 관련 상수 모음;
SMA_CMD_ID_INIT_IDLE_STATE = $1100;
SMA_CMD_ID_PRE_FLIGHT = $0101;
SMA_CMD_ID_PERFORM_BIT = $0102;
SMA_CMD_ID_SEND_BIT_RESULTS = $0103;
// ...
if (nIndex in [SMA_CMD_ID_INIT_IDLE_STATE, SMA_CMD_ID_PRE_FLIGHT ])) then
발생한 오류는 다음과 같습니다.
[Error] SmaClientThreadUnit.pas(168): Constant expression violates subrange bounds
보통 위와 같은 오류는 enum 형 데이터의 범위를 제한해 놓고, 범위를 벗어난 값을 입력하고자 할 경우 발생하는 오류입니다.
type
TNums = 1..9;
var
my_data: TNums;
begin
my_data := 1; // OK
my_data := 0; // Error : Constant expression violates subrange bounds
end.
해결 방안
해결 방안은 두 가지 정도 생각해 볼 수 있을 것 같습니다.
첫 번째는, 상수를 정의할 때 반드시 255 이내의 값으로 정의하는 방법입니다.
const
// SMA 관련 상수 모음;
SMA_CMD_ID_INIT_IDLE_STATE = $11;
SMA_CMD_ID_PRE_FLIGHT = $12;
SMA_CMD_ID_PERFORM_BIT = $13;
SMA_CMD_ID_SEND_BIT_RESULTS = $14;
두 번째는, "in" 연산자를 사용하지 않고, "if" 또는 "case" 문법을 이용하는 방법입니다.
if ( true
and (pHeader^.CommandID <> SMA_CMD_ID_INIT_IDLE_STATE)
and (pHeader^.CommandID <> SMA_CMD_ID_PRE_FLIGHT)
and (pHeader^.CommandID <> SMA_CMD_ID_PERFORM_BIT)
and (pHeader^.CommandID <> SMA_CMD_ID_SEND_BIT_RESULTS)
) then
begin // 처리할 수 있는 명령이 아닌 경우, 건너뛰기
Continue;
end;
저는 상수의 범위를 255 아래로 제한할 수 없어서, if 문으로 처리하였습니다.
'프로그래밍 > 델파이' 카테고리의 다른 글
[Delphi] Cannot allocate socket on Windows 95 (0) | 2021.12.01 |
---|---|
[Delphi] Windows 95에서 Comctl32.dll로 인한 실행 문제 (0) | 2021.11.26 |
CCITT CRC16() 함수 (0) | 2021.09.14 |
[pascal] 라디오 버튼 선택 동작 (0) | 2021.09.08 |
[pascal] 16진, 10진 숫자 문자열을 정수형으로 변환하기 (StrToInt) (0) | 2021.09.07 |