2010-10-30 50 views
0

我们正在尝试在delphi中使用由Free Pascal生成的pas文件。链接在: http://www.markwatson.com/opensource/FastTag_Pascal.zip如何解决这个EInvalidPointer错误,同时将Free Pascal翻译成Delphi?

在测试时,它会提示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; 

... 
... 
... 

我们该如何解决这个问题。 非常感谢您提前。

回答

3

原始来源没有设置任何编译模式,所以默认的TP模式是激活的,意思是string = shortstring。

用短字符串替换整个源字符串,它可能会工作。

+0

亲爱的Marco van de Voort,它现在可以工作,但我仍然不知道为什么它应该按照您的建议替换,而且加载该词典文件并运行似乎非常缓慢。非常感谢你。 – Dylan 2010-10-31 02:10:37

3

我可以在TagWordList过程中找到至少两个错误。

  1. for i := 0 to length(wordList) do,阵列为基础的1,因此环具有开始与1
  2. 的位后有一个检查if i > 0,对于相同的原因而失败。

它也可能是big_sarray = array[1..1000] of string;类型的错误定义。如果您将其更改为基于0的阵列,可能会起作用。