gpt4 book ai didi

将 Delphi 3 迁移到 Delphi 2010 时出现字符串问题

转载 作者:行者123 更新时间:2023-12-03 15:09:32 25 4
gpt4 key购买 nike

我得到了一个旧项目的源代码,必须更改一些小东西,但我遇到了大麻烦,因为只有 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”更改为“string[255]”或“shortstring”。执行此操作时,应用程序正在读取文件,但内容错误。

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

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

最佳答案

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

我发现您已经尝试过,但报告失败。这确实是唯一对我有意义的解释,因为所有其他字符串类型本质上都是指针,因此 read 的唯一工作方式是使用 ShortString。您正在尝试的迁移是巨大的,您可能会遇到大量令人困惑的问题。

@LU RD 在评论中提出了一个很好的观点,即记录布局可能因 Delphi 版本而异,因为您没有使用压缩数组。您可以使用手头的两个 Delphi 版本来研究记录布局。您需要安排记录的大小在版本之间匹配,并且字段的偏移量也匹配。

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

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

您也可以通过设置 $ALIGN 来达到相同的效果{$ALIGN ON} 的编译器选项,这就是我认为我会做的事情。

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

关于将 Delphi 3 迁移到 Delphi 2010 时出现字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com