Delphi Records获取地址访问冲突...

时间:2020-06-11 03:26:21

标签: memory freepascal pascalscript

我是Delphi / Pascal语法的新手(尽管实际上可能是FreePascal或PascalScript)。我在宏软件中使用它来与宏软件的API进行交互。我正在尝试与宏软件所有者联系,以让我确切地知道脚本引擎使用的是什么。

无论如何,我在使用具有内存访问权限的记录时遇到了问题,我一生都无法解决。使用下面发布的代码,我得到的确切错误是:

FullcalendarEngine::Engine.routes.url_for({:action=>"index", host: "localhost"}, 'fullcalendar_engine_path')

第53行是:Module: "", Line: 53, Message: Access violation at address 02BC88A8. Read of address 00280060

bars[Length(bars) - 1].Y := foos[i].B;
uses SysUtils;

type
  TFoo = record
    A: cardinal;
    B: int64;
    C: string;
  end;
  TBar = record
    X: cardinal;
    Y: int64;
    Z: string;
  end;

我摘录了一些示例,它似乎给我的实际代码同样的错误。我无法发布实际的代码,因为它毫无意义,并且不会在宏软件api和我要控制的软件之外运行-都需要许可证。

我正在尝试创建var foos: array of TFoo; bars: array of TBar; i: Integer; counter: Integer; ,它是bars的子集,并应用了一些转换(包括身份)。

如果有用的话:我的实际脚本从文件读入“ foos”,其中每个记录对应文件中的一行,每个元素对应一个逗号分隔的字段。我基本上创建了准系统CSV分析器。此CSV用作我的初始脚本配置。然后,我必须遍历配置并检查要为其编写宏的应用程序的状态。如果满足某些条件,我想将我的配置值从foo复制到bar,但是需要基于要控制的应用程序的状态来应用一些转换。然后,“ bars”最终将用于生成针对该应用程序运行的宏命令。

实际的应用程序会收到这样的错误,并且在遍历foos时不会始终在同一位置失败:

foos

这行代码与我的示例代码中的形式相同:

Module: "Main", Line: 119, Message: Access violation at address 02BC88A8. Read of address 00320044

此示例程序不会始终失败,因此我将其包装成一个循环。但是,在我正在使用的宏应用程序中,当我使用循环时(在计数器= 1,大声笑),脚本似乎更加一致地失败。

我不知道我在想什么,请帮忙。

FinalConfig[Length(FinalConfig) - 1].Qty    := InitialConfig[i].Qty;

预期输出:

begin
  counter:= 0;
  while (true) do
  begin
    counter:= counter + 1;
    print(counter);
    SetLength(foos, 3);
    with foos[0] do
      begin
        A := 1;
        B := 2;
        C := 'three';
      end;
    with foos[1] do
      begin
        A := 4;
        B := 5;
        C := 'six';
      end;
    with foos[2] do
      begin
        A := 7;
        B := 8;
        C := 'nine';
      end;

    for i:= 0 to Length(foos) - 1 do
    begin
      if foos[i].B > 3 then
      begin
        SetLength(bars, Length(bars) + 1);
        bars[Length(bars) - 1].X := foos[i].A;
        bars[Length(bars) - 1].Y := foos[i].B;
        bars[Length(bars) - 1].Z := foos[i].C;
      end;
    end;

    for i:= 0 to Length(bars) - 1 do
    begin
      print(Format('X: %d, Y: %d, Z: %s', [bars[i].X, bars[i].Y, bars[i].Z]));
    end;
  end;
end.

0 个答案:

没有答案
相关问题