2011-08-22 20 views
6

Merhaba çocuklar ben bir garip sorun var ve ben yanlış yapıyorum nerede bilmiyorum Sorun Delphi operatör "in" ...

Bunu nerede Aşağıdaki kod bunun sonuna bakın lütfen adres bu i

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

o hattı yerini tabii

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; 

... bunu yorumladı başarısız ama ben yanlış yapıyorum bilmek istiyorum.

cevap

12

Küme, aynı türden değerler topluluğudur. Bu tür ordinal olmalı ve bu tür bir değişken en fazla 256 olası değere sahip olmalıdır. (Official documentation) Bu nedenle, bir dizi tam sayı içeremez, çünkü 256'dan fazla olası tam sayı var.

if InRange(ep, tmp1, tmp2) then 

(uses Math):

Sen InRange işlevini kullanabilirsiniz.

+1

Şimdi anladım, çok teşekkürler! – opc0de

+2

@ opc0de: FWIW, derleyicinin bunun hakkında bir şey söylemesi gerektiğini düşünüyorum. En azından, bir uyarı vermelidir ... –

+0

Belki gelecek sürümlerde :)) – opc0de