2011-08-22 8 views
6

Ciao ragazzi ho un problema strano e non so dove sto facendo male ...problema con "in" operatore a Delfi

Ho il seguente codice si prega di guardare alla fine di esso che è dove fallisce ho commentato che ...

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; 

Naturalmente posso sostituire quella linea con

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

ma voglio sapere che cosa sto facendo male.

risposta

12

Un set è una raccolta di valori dello stesso tipo. Questo tipo deve essere ordinale e una variabile di questo tipo deve avere al massimo 256 possibili valori. (Official documentation) Quindi, un set non può contenere numeri interi, poiché ci sono più di 256 possibili numeri interi.

è possibile utilizzare la funzione InRange:

if InRange(ep, tmp1, tmp2) then 

(uses Math).

+1

Capito subito, grazie mille! – opc0de

+2

@ opc0de: FWIW, penso davvero che il compilatore dovrebbe dire qualcosa a riguardo. Per lo meno, dovrebbe dare un avvertimento ... –

+0

Forse nelle future versioni :)) – opc0de