프로그래밍/델파이

[pascal] in 연산자의 "Constant expression violates subrange bounds" 오류

채윤아빠 2021. 11. 7. 11:39
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 문으로 처리하였습니다.