如何在将Free Pascal翻译成Delphi时修复此EInvalidPointer错误?

时间:2010-10-30 11:32:55

标签: delphi

我们要在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;

...
...
...

我们如何解决它。 非常感谢你提前。

2 个答案:

答案 0 :(得分:3)

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

  1. for i := 0 to length(wordList) do,数组是从1开始的,因此循环必须从1开始。
  2. 稍后有一个检查if i > 0由于同样的原因而失败。
  3. 它也可能是big_sarray = array[1..1000] of string;类型的错误定义。如果将其更改为基于0的数组,则可能有效。

答案 1 :(得分:3)

原始源未设置任何编译器模式,因此默认的TP like模式处于活动状态,即string = shortstring。

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