2011-08-22 5 views
6

안녕 얘들 아 내가이 이상한 문제를 가지고 내가 잘못하고 있어요 어디에서 모르는 문제는 델파이 연산자 "에서"...

나는 그 어디 다음 코드는 그것의 끝에서 찾아보세요있다 내가

if (ep>=tmp1) and (ep<=tmp2) 

으로 그 선을 대체 할 수 물론

var 
    IDH:PImageDosHeader; 
    INH:PImageNtHeaders; 
    ISH:PImageSectionHeader; 
    buf:Pointer; 
    FS:TFileStream; 
    ep,tmp1,tmp2:DWORD; 
    i:Word; 
begin 
    if OpenDialog1.Execute then 
    begin 
     FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone); 
     GetMem(buf,FS.size); 
     FS.Read(buf^,FS.Size); 
     FS.Free; 
     IDH:=PImageDosHeader(buf); 
     INH:=PImageNtHeaders(DWORD(buf) + DWORD(IDH^._lfanew)); 
     ep:=INH^.OptionalHeader.AddressOfEntryPoint; 
     for i:=0 to INH^.FileHeader.NumberOfSections - 1 do 
     begin 
      ISH:=PimageSectionHeader(DWORD(INH) + sizeof(TImageNtHeaders) + i * sizeof(TImageSectionHeader)); 
      tmp1:=ISH^.VirtualAddress; 
      tmp2:=ISH^.VirtualAddress + ISH^.Misc.VirtualSize; 
      ShowMessageFmt('%d -> %d .. %d',[ep,tmp1,tmp2]); 
      if ep in [tmp1..tmp2] then ShowMessage('Got it'); //This fails even if ep is in the defined interval. Why? 
     end; 
    end; 
end; 

... 내가 그것을 주석에 실패하지만 난 내가 뭘 잘못 알고 싶어요.

답변

12

집합은 동일한 유형의 값 모음입니다. 이 유형은 서수 여야하며이 유형의 변수는 최대 256 개의 가능한 값을 가져야합니다. (Official documentation) 따라서 가능한 정수가 256 개 이상이므로 집합에 정수를 포함 할 수 없습니다.

if InRange(ep, tmp1, tmp2) then 

(uses Math) :

당신은 InRange 기능을 사용할 수 있습니다.

+1

지금 고맙습니다. – opc0de

+2

@ opc0de : FWIW, 나는 정말로 컴파일러가 이것에 대해 뭔가를 말해야한다고 생각합니다. 적어도, 그것은 경고를해야합니다 ... –

+0

어쩌면 미래 버전 :)) – opc0de