我们要在delphi中使用Free Pascal生成的pas文件。链接位于: http://www.markwatson.com/opensource/FastTag_Pascal.zip
在测试时,它会提示InValidPointer。请查看调试器中的以下错误行。
interface
procedure ReadLexicon;
type sarray = array[1..12] of string;
type big_sarray = array[1..1000] of string; { used for word lists and tags: limit on size of input text }
type psarray = ^sarray;
{function GetTagList(word: string): psarray;}
procedure TagWordList(wordList : big_sarray; var tags : big_sarray);
implementation
uses SysUtils, Classes;
{ Hash Table Support - copied from FreePascal source: benchmork shootout examples }
type
THashEntryPtr = ^THashEntryRec;
THashEntryRec = record
name : string;
number : psarray;
next : THashEntryPtr;
end;
const
TABLE_SIZE = 100000;
...
...
...
function GetTagList(word: string): psarray;
var
ret : psarray;
ok : boolean;
begin
ok := localHash.fetch(word, ret);
if ok then GetTagList := ret else GetTagList := nil;
end;
procedure TagWordList(wordList : big_sarray; var tags : big_sarray);
var i : integer;
x : real;
psa : psarray;
lastThreeChars : string;
lastTwoChars : string;
lastChar : string;
firstTwoChars : string;
tagFirstTwoChars : string;
begin
for i := 0 to length(wordList) do
begin
**psa := GetTagList(wordList[i]);///// EInvalidPointer ERROR**
if psa <> nil then tags[i] := psa^[1] else tags[i] := '???';
end;
...
...
...
我们如何解决它。 非常感谢你提前。
答案 0 :(得分:3)
我可以在TagWordList过程中找到至少两个错误。
for i := 0 to length(wordList) do
,数组是从1开始的,因此循环必须从1开始。if i > 0
由于同样的原因而失败。它也可能是big_sarray = array[1..1000] of string;
类型的错误定义。如果将其更改为基于0的数组,则可能有效。
答案 1 :(得分:3)
原始源未设置任何编译器模式,因此默认的TP like模式处于活动状态,即string = shortstring。
用shorttring替换整个源字符串,它可能会起作用。