2011-08-22 16 views
6

Cześć chłopaki mam dziwny problem i nie wiem, gdzie robię źle ...problem z „w” operatora w Delphi

Mam następujący kod proszę spojrzeć na końcu to właśnie tam to nie ja skomentował to ...

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; 

oczywiście można zastąpić tę linię z

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

ale chcę wiedzieć, co robię źle.

Odpowiedz

12

Zestaw to zbiór wartości tego samego typu. Ten typ musi być porządkowy, a zmienna tego typu musi mieć maksymalnie 256 możliwych wartości. (Official documentation) W związku z tym zestaw nie może zawierać liczb całkowitych, ponieważ istnieje więcej niż 256 możliwych liczb całkowitych.

Można użyć InRange funkcję:

if InRange(ep, tmp1, tmp2) then 

(uses Math).

+1

Rozumiem, dziękuję bardzo! – opc0de

+2

@ opc0de: FWIW, naprawdę myślę, że kompilator powinien coś o tym powiedzieć. Przynajmniej powinien dać ostrzeżenie ... –

+0

Może w przyszłych wersjach :)) – opc0de