求值器中的表达式非法(&访问冲突)

2024-01-18

我试图通过使用类 Tbb2uc 来处理纯文本文件(加载到 StringList 中),但在调用函数 GetAddress 时获取 AV。

  TArrayQuotePositions = array[1..4] of integer;

  Tbb2uc = class(TObject)
  private
    Farrayquotes: TArrayQuotePositions;
    SlInput: TStringList;
    Inputfilename: TFileName;
    SlOutput: TStringList;
    function GetQuotePositions( aLine: string ): TArrayQuotePositions;
    function GetInvoice( aLine: string ): string;
    function GetName( aLine: string ): string;
    function GetAddress( aLine: string ): string;
    function GetSwift( aLine: string ): string;
    function ProcessSl: integer;        
  public
    constructor Create;
    destructor Destroy; override;
    function OpenFile: integer;
  end;

function Tbb2uc.GetInvoice( aLine: string ): string;
var
  quotesPos: TArrayQuotePositions;
begin
  quotesPos := GetQuotePositions( aLine );
  result := copy( aLine, quotesPos[3]+1, (quotesPos[4]-quotesPos[3])-1 );
end;

function Tbb2uc.GetName( aLine: string ): string;  
var
  quotesPos: TArrayQuotePositions;
begin
  quotesPos := GetQuotePositions( aLine );
  result := copy( aLine, quotesPos[3]+1, (quotesPos[4]-quotesPos[3])-1 );
end;

执行甚至不会跳转到函数中。我在调用这个函数时得到了 AV。

function Tbb2uc.GetAddress( aLine: string ): string;
var
  quotesPos: TArrayQuotePositions;
  address1: string;
  address2: string;
begin
  quotesPos := GetQuotePositions( aLine );
  address1 := copy( aLine, quotesPos[1]+1, (quotesPos[2]-quotesPos[1])-1 );
  address2 := copy( aLine, quotesPos[3]+1, (quotesPos[4]-quotesPos[3])-1 );
  result := address1 + ' ' + address2;
end;

使用以上函数:

function Tbb2uc.ProcessSl: integer;
var
  i: integer;
  line: string;
  invoice,name,addr,swift: string;
begin
  SlInput.LoadFromFile( string(Inputfilename) );
  //
  for i := 0 to SlInput.Count -1 do begin
    if ansipos( STARTSTRING, SlInput[i]) <> 0 then begin
      invoice := GetInvoice(SlInput[i]);
      name := GetName(SlInput[i+1]);
      ////
      addr := GetAddress(SlInput[i+2]); //Access Violation
      ////
      swift := GetSwift(SlInput[i+4]);
      line := line + invoice + ';' + name + ';' + addr + ';' + swift;
    end;
    SlOutput.Add(line);
    line := '';
  end;
  SlOutput.SaveToFile( OUTPUT_FNAME );
end;

执行正常,直到调用 GetAddress。在调试时,当评估 SlInput[i+2] 时,我得到“评估器中的表达式非法”,现在我不知道。正如你所看到的,我只处理字符串列表的行。


您正在越界访问字符串列表。

for i := 0 to SlInput.Count -1 do begin

 // ...(etc)

      addr := GetAddress(SlInput[i+2]); 

i正在运行到列表的完整大小。您的索引比这个高两个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求值器中的表达式非法(&访问冲突) 的相关文章

  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 在 Delphi 中淡入 alpha 混合 PNG 表单

    几年前 当 Vista 首次发布时 我曾提出过这个问题 但始终没有解决这个问题 并把它搁置起来 留待以后再考虑 我有一个启动屏幕 我花了很大力气让它看起来很棒 这是 32bpp alpha 混合的 PNG 我有一些代码 如果需要 我可以挖掘
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • D2010编译行数差异

    构建项目时 有两个地方会报告源代码行数 在编译进度对话框中 项目下 信息 在 Delphi 2007 中 对于我们正在构建的项目 这两个数字是相同的 在 Delphi 2010 中 这两个数字截然不同 1st 计数多出 100 万行或 40
  • Delphi XE4 中是否可以更改应用程序短标题而不使其与项目 dpr 名称相同?

    我正在编写我的第一个由 delphi 驱动的 iPhone 应用程序 我已经创建了它 但我希望将其命名为 dpr 文件名称以外的名称 因为 dpr 文件不能包含空格 例如 EXE 名称并不总是与人们可能分配给应用程序的人类可读名称相同 而在
  • Delphi + Synapse:如何检查我是否仍然连接

    我在用TTCPBlockSocket http synapse ararat cz doc help blcksock TTCPBlockSocket html对于 TCP IP 应用程序 问题是我无法确定连接何时丢失 GetLastErr
  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • Delphi 2005 Web 服务问题

    我在尝试通过 Delphi 访问 Web 服务时遇到问题 我使用了 2007 版 WSDLimp 工具的 java WSDL 看起来它已正确创建了所有对象 然而 当我制作一个调用该服务的测试程序时 每个对象都是空的 如果我在 HTTPRIO
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • Windows 更新后 Active 设置为 False 时 TIdHttpServer 冻结

    我们有一个 Indy 版本 10 6 1 5235 TIdHttpServer 服务 多年来一直与 Delphi 2007 配合良好 在最新的 Windows 更新 KB4338815 和 KB4338830 之后 我们注意到当 TIdHt
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • delphi专家中的第三方依赖

    我正在编写一个delphi ide Expert 带有一些第三方依赖项 视觉控件 我的问题是当这个专家将安装在目标机器上时 这台电脑是否也需要安装这些第三方组件 或者组件是embeded在生成的 bpl 内部 它们将依赖于您放置在包的 re
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile

随机推荐