5

我得到了一个旧项目的源代码并且不得不改变一些小事情,但我遇到了大麻烦,因为只有 delphi 2010 可以做到这一点。

定义了一条记录:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

稍后此定义用于从文件中读取:

b_bil: file of bbil;
pbbil: ^bbil;
l_bil : tlist;

while not(eof(b_bil)) do
  begin
    new(pbbil);
    read(b_bil, pbbil^);
    l_bil.add(pbbil);
  end

主要问题是,编译器不接受记录中的“字符串”类型,因为他想要“最终化”。所以我尝试将“string”更改为“string[255]”或“shortstring”。执行此操作的应用程序正在读取文件但内容错误。

我的问题是如何将用于写入文件的旧“字符串”类型转换为 Delphi 2010 中的“新”类型。

我已经尝试了很多,例如“{$H-}”。在记录中仅添加一个字符显示,该文件是正确的,因为文件读取几乎正确,但每个数据集又截断了一个字符 - lengthbyte+255chars 的长度似乎是正确的 fpr 定义但短字符串不匹配。

4

3 回答 3

5

哎呀!看起来您的代码要么早于日期,要么不使用长字符串。如果您想获得与旧 Delphi 相同的行为,则需要替换stringShortString.

我看到你已经尝试过了,并报告它失败了。这真的是唯一对我有意义的解释,因为所有其他字符串类型本质上都是指针,因此唯一可行的方法read是使用ShortString. 您正在尝试的迁移是巨大的,您可能会遇到大量令人困惑的问题。

@LU RD 在评论中指出,由于您没有使用packed数组,Delphi 版本之间的记录布局可能会有所不同。您可以使用手头的两个 Delphi 版本调查记录布局。您需要安排版本之间的记录大小匹配,并且字段的偏移量也匹配。

根据下面的评论,在 pos 和 nr 之间添加一个填充字节将解决您的问题。

bbil = record
  path : string;
  pos: byte;
  _pad: byte;
  nr: Word;
end;

$ALIGN您也可以通过将编译器选项设置为{$ALIGN ON}我认为我会做的事情来实现相同的效果。

从长远来看,你真的应该摆脱短字符串、ANSI 编码、内部记录和数据文件之间的直接映射等等。在短期内,您最好使用与用于构建此代码并使用该代码相同的 Delphi 版本。我希望这个问题只是冰山一角。

于 2012-01-16T17:37:56.653 回答
2

只要记住:

“字符串” <> “字符串 [255]” <> “短字符串” <> AnsiString

回到旧的 DOS/Turbo Pascal 时代,“字符串”确实被限制为 255 个字符。很大程度上是因为第一个字节包含字符串长度,而一个字节只能有 0 到 255 之间的值。

在当代版本的 Delphi 中,这不再是问题。

ShortString ”是旧 DOS/Pascal 字符串类型的类型。

“LongString”长期以来一直是默认的字符串类型(包括我目前用于大多数生产工作的 Borland Delphi 2006)。从 Delphi 3 .. Delphi 2009 开始,LongStrings 包含8 位字符,并且仅受可用内存的限制。从 Delphi 3 .. Delphi 2009 开始,“LongStrings”是“AnsiStrings”的同义词。

Delphi 的最新版本(Delphi 2009 及更高版本,包括新的 Delphi XE2)现在都默认为多字节 Unicode“WideString”字符串。WideStrings和 AnsiStrings 一样,在最大长度上也有效地“无限”。

这篇文章更详细地解释了:

http://delphi.about.com/od/beginners/l/aa071800a.htm

PS:考虑对二进制记录使用“sizeof(bbil)”和“ Packed ”。

于 2012-01-16T18:56:30.003 回答
0

也许我忽略了一些东西,但是,在我看来,你的 delphi 3 代码也被破坏了。尝试确定记录的大小:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

路径(1 到 256 之间的任何值 - 长度为一个字节,数据为其余字节),pos(1 个字节),nr(2 个字节),使您的记录数据大小从 1+1+2=4 字节到 256+1+ 2=259 字节。在这种情况下,无论如何你都会从文件中得到垃圾,因为你的程序现在不能在实际读取数据之前读取多少字节。我建议您修复您的记录,以使字符串具有固定大小,例如:

path : ShortString[255];

然后,您将能够在 delphi 3 和 2010 中正常读写。

于 2012-06-05T14:42:13.493 回答