首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TurboPower B-Tree和Delphi XE2 -有人做过吗?

TurboPower B-Tree和Delphi XE2 -有人做过吗?
EN

Stack Overflow用户
提问于 2012-01-12 14:59:57
回答 3查看 2K关注 0票数 1

我可能是地球上最后一个依靠B树飞勒的人,但我从德尔菲2007跳到了XE2。

在克服了所有AnsiChar和PAnsiChar问题之后,代码现在会崩溃,在页面上使用零项的范围检查。

是否有人在Delphi XE2下成功运行B-Tree?如果是这样的话,你是如何做到的?

更新范围检查错误如下:

代码语言:javascript
复制
procedure IsamUnPack(var Page : IsamPage; KeyL : Word); 
var 
  I, K, S : Word; 
  P : Array [0..0] Of Byte absolute Page; {Real bounds [0..65535]} 
begin 
 K := KeyL + 9; 
 S := Pred (Page.ItemsOnPage) * K + 6; 
 if KeyL <> MaxKeyLen then begin 
    for I := Page.ItemsOnPage downto 2 do begin 
     Move(P[S], Page.ItemArray[I], K); // Range Check error in Warren P's suggestion 
     S := S - K;  
     end; 
 end; 
end; 

虽然Page.ItemsOnPage不应该是零(在这里范围检查错误是有效的),但它可能是由数据对齐问题引起的。添加到BTDEFINE.INC中的这段代码似乎在起作用.

代码语言:javascript
复制
{$IFDEF VER230}
{$DEFINE UsingDelphi}
{$ENDIF}

{$IFDEF VER230} {Delphi XE2}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-13 15:20:53

--我做了一个快速端口,目前我已经基本使用了工作的,足够让包含的Delphi演示程序工作。我的第一次尝试失败了,因为我忽略了演示代码中的一些字符串->和字符串更改,这导致演示代码函数PadCH出现故障。修复之后,演示程序和底层库看起来很有功能,至少用于阅读,但我还没有测试编写、修改和创建文件。演示中的上述文件是在早期版本中创建的,因此至少它是二进制读兼容的。如果有大量的bug、数据损坏问题等等,我不会感到惊讶,所以请不要在生产中使用这段代码,或者如果您这样做了,您将承担您自己的风险。

我的工作是在这里:托管在微软天道 (4.3megs,ZIP) (文件名tpbtreefiler_xe2_v2.zip)

更新函数IsamUnpack在ISAMWORK.INC中。

Update2现在OP发现,添加一些ifdef版本常量支持会导致{$R-}和一些对齐标志被打开,这也是库正常工作所必需的。我可以建议在BTDEFINE.INC中使用以下不同的声明方式,通过使用不会破坏下一个Delphi版本的比较,绕过经典的Delphi“每次更改delphi编译器版本时都会中断”:

代码语言:javascript
复制
{$IF CompilerVersion > 20.0 } 
{ Keep working from Delphi 2009 UP}
{$DEFINE UsingDelphi}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}

更新3我怀疑代码中仍然存在移植问题,这可能会导致数据丢失和数据文件损坏。这里有一个例子,记录的数量(在我的演示应用程序中应该是在50左右的范围内)被报告为一个大于100万的数字,这显然是无效的。

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 19:01:16

还有两个项目要检查

  1. 将"string“改为"AnsiString”
  2. 如果目标构建为64位,则您的更改将无法使其就绪。

干杯

票数 0
EN

Stack Overflow用户

发布于 2013-11-13 00:10:58

在我完成了所有工作之后,我发现从XE2应用程序中重新建立索引破坏了带有isam错误#10122 (“文件块的页面大小大于MaxPageSize")的BTreeFiler (BTreeFiler)表。以下是解决办法:

需要在Filer.pas中对此进行更改,以便重新编制索引以使其工作:

代码语言:javascript
复制
IsamInfoRec = packed Record
    InfoRec : IsamSmallInfoRec;
    DummyFill : AnsiChar; <<<<<<<< Here!
    KeysUsed : LongInt;{Must start on an even offset for C-compatibility}
    PageSizeUsed : Word; {!!.42}
End;

我希望沃伦(上面)用这个额外的方法来更新他的工作。我还在TurboPower BTreeFiler SourceForge网站上发布了这篇文章。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8837159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档