Delphi中"in"运算符的问题

opc*_*0de 6 delphi operators

嗨,伙计们,我有一个奇怪的问题,我不知道我在哪里做错了...

我有以下代码,请看它的结尾,它是失败的我评论它...

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;
Run Code Online (Sandbox Code Playgroud)

当然我可以替换那条线

if (ep>=tmp1) and (ep<=tmp2) 
Run Code Online (Sandbox Code Playgroud)

但我想知道我做错了什么.

And*_*and 12

集合是相同类型的值的集合.此类型必须是序数,并且此类型的变量必须最多具有256个可能的值.(官方文档)因此,一个集合不能包含整数,因为有超过256个可能的整数.

你可以使用这个InRange功能:

if InRange(ep, tmp1, tmp2) then
Run Code Online (Sandbox Code Playgroud)

(uses Math).

  • @ opc0de:FWIW,我真的认为编译器应该说些什么.它至少应该发出警告...... (2认同)
  • @Rudy运行我发布的代码,如果你看到一个警告或错误,我欠你一杯啤酒;)如果不是你欠我一个六包;) (2认同)