Delphi - 列表索引越界(4)

2024-04-25

我知道这个问题已经被提出了一百万次,但是,我无法理解为什么这段代码会抛出错误,我已经找到了导致错误的罪魁祸首 FOR 循环,但是,我没有看到它有任何问题。

我收到错误 - “列表索引超出范围 (4)”

function TNetwork.FeedForward(InputVals : array of Real) : Real;
var
  I : Integer;
begin

  for I := 0 to Length(InputVals)-1 do
  begin
    Input[I].Input(InputVals[I]);
  end;

  for I := 0 to Length(Hidden)-1 do
  begin
    Hidden[I].CalcOutput;
  end;

  Output.CalcOutput;

  Result := Output.GetOutput;
  end;

错误发生在第二个For循环上,这里是我设置隐藏数组大小的地方。

constructor TNetwork.Create(Inputs, HiddenTotal : Integer);
var
  C : TConnection;
  I, J : Integer;
begin
  LEARNING_CONSTANT := 0.5;

  SetLength(Input,Inputs+1);
  SetLength(Hidden,HiddenTotal+1);

所以,正如我所见,循环只执行了三次,那么为什么它要尝试索引第四个空间呢?不要介意为什么,更重要的是,如何?

如果有人可以阐明原因以及可能的解决方案,我将不胜感激

为了完整起见,这是完整的单元..

unit NeuralNetwork_u;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Math;

type
  TConnection = Class;
  TNeuron = class(TObject)
  protected
    Output : Real;
    Connections : TList;
    isBias : Boolean;
  public
    Constructor Create; overload;
    Constructor Create(BiasValue : Integer); overload;
    procedure CalcOutput;
    procedure AddConnection( Con : TConnection );
    function GetOutput : Real;
    Function F( X : Real ) : Real;
  end;

  TConnection = class
  private
    nFrom, nTo : TNeuron;
    Weight : Real;
  public
    constructor Create(a , b : TNeuron) ; overload;
    constructor Create(a, b : TNeuron ; W : Real) ; overload;
    function GetFrom : TNeuron;
    function GetTo : TNeuron;
    function GetWeight : Real;
    procedure AdjustWeight(DeltaWeight : Real);
  end;


type TInputNeuron = class(TNeuron)
public
  procedure Input (D : Real);
end;

type THiddenNeuron = class(TNeuron)
private
public
end;

type TOutputNeuron = Class(TNeuron)
private
public
end;

type TNetwork = class(TObject)
private
  LEARNING_CONSTANT : Real;
public
  Input : array of TInputNeuron;
  Hidden : array of THiddenNeuron;
  Output : TOutputNeuron;

  constructor Create(Inputs,HiddenTotal : Integer);
  function FeedForward(InputVals : array of Real) : Real;
  function Train(Inputs : array of Real ; Answer : Real) : Real;
  function TrainOnFile(Epochs : Integer ; TrainingFile : String) : Real;
end;

implementation

constructor TNeuron.Create;
begin
  Output := 0;
  Connections := TList.Create;
  isBias := False;
end;

Constructor TNeuron.Create(BiasValue : Integer);
begin
  Output := BiasValue;
  Connections := TList.Create;
  isBias := True;
end;

procedure TNeuron.CalcOutput;
var
  Sum : Real;
  Bias : Real;
  C : TConnection ;
  NeuronFrom, NeuronTo : TNeuron;
  I : Integer;
begin
  if isBias then

  else
  begin
    Sum := 0;
    Bias := 0;
    for I := 0 to Connections.Count do
    begin
      C := Connections[I];
      NeuronFrom := C.GetFrom;
      NeuronTo := C.GetTo;
      if NeuronTo = self then
      begin
        if NeuronFrom.isBias then
        begin
          Bias := NeuronFrom.GetOutput * C.GetWeight;
        end
        else
        begin
          Sum := Sum + NeuronFrom.GetOutput * C.GetWeight;
        end;
      end;
    end;
    Output := F(Bias + Sum);
  end;  
end;

procedure TNeuron.AddConnection(Con : TConnection);
begin
  Connections.Add(Con) ;
end;

function TNeuron.GetOutput : Real;
begin
  Result := Output;
end;

function TNeuron.F( X : Real ) : Real;
begin
  Result := 1.0 /(1.0 + Exp(-X));
end;

procedure TInputNeuron.Input ( D : Real);
begin
  Output := D;
end;

constructor TConnection.Create(a, b : TNeuron);
begin
  nFrom := a;
  nTo := b;
  Weight := Random * 2 - 1;
end;

constructor TConnection.Create(a, b : TNeuron ; w : Real);
begin
  nFrom := a;
  nTo := b;
  Weight := w;
end;

function TConnection.GetFrom : TNeuron;
begin
  Result := nFrom;
end;

function TConnection.GetTo : TNeuron;
begin
  Result := nTo;
end;

function TConnection.GetWeight;
begin
  Result := Weight;
end;

procedure Tconnection.AdjustWeight(DeltaWeight : Real);
begin
  Weight := Weight + DeltaWeight;
end;

constructor TNetwork.Create(Inputs, HiddenTotal : Integer);
var
  C : TConnection;
  I, J : Integer;
begin
  LEARNING_CONSTANT := 0.5;

  SetLength(Input,Inputs+1);
  SetLength(Hidden,HiddenTotal+1);

  for I := 0 to Length(Input)-1 do
  begin
    Input[I] := TInputNeuron.Create;
  end;

  for I := 0 to Length(Hidden)-1 do
  begin
    Hidden[I] := THiddenNeuron.Create;
  end;

  Input[Length(Input)-1] := TInputNeuron.Create(1);
  Hidden[Length(Hidden)-1] := THiddenNeuron.Create(1);

  Output := TOutputNeuron.Create;

  for I := 0 to Length(Input)-1 do
  begin
    for J := 0 to Length(Hidden)-1 do
    begin
      C := TConnection.Create(Input[I],Hidden[J]);
      Input[I].AddConnection(C);
      Hidden[J].AddConnection(C);
    end;  
  end;

  for I := 0 to Length(Hidden)-1 do
  begin
    C := TConnection.Create(Hidden[I],Output);
    Hidden[I].AddConnection(C);
    Output.AddConnection(C);
  end;  
end;

function TNetwork.FeedForward(InputVals : array of Real) : Real;
var
  I : Integer;
begin
  for I := 0 to Length(InputVals)-1 do
  begin
    Input[I].Input(InputVals[I]);
  end;

  for I := 0 to Length(Hidden)-1 do
  begin
    Hidden[I].CalcOutput;
  end;

  Output.CalcOutput;

  Result := Output.GetOutput;
end;

function TNetwork.Train(Inputs : array of Real ; Answer : Real) : Real;
var
  rResult : Real;
  deltaOutput, rOutput, deltaWeight, Sum, deltaHidden : Real;
  Connections : TList;
  C : TConnection;
  Neuron : TNeuron;
  I, J : Integer;
begin
  rResult := FeedForward(Inputs);
  deltaOutput := rResult * (1 - rResult) * (Answer - rResult);
  Connections := Output.Connections;
  for I := 0 to Connections.Count do
  begin
    C := Connections[I];
    Neuron := C.GetFrom;
    rOutput := Neuron.Output;
    deltaWeight := rOutput * deltaOutput;
    C.AdjustWeight(LEARNING_CONSTANT * deltaWeight);
  end;

  for I := 0 to Length(Hidden) do
  begin
    Connections := Hidden[I].Connections;
    Sum := 0;
    for J := 0 to Connections.Count do
    begin
      C := Connections[J];
      if c.GetFrom = Hidden[I] then
      begin
        Sum := Sum + (C.GetWeight * deltaOutput);
      end;
    end;

    for J := 0 to Connections.Count do
    begin
      C := Connections[I];
      if C.GetTo = Hidden[I] then
      begin
        rOutput := Hidden[I].GetOutput;
        deltaHidden := rOutput * ( 1 - rOutput);
        deltaHidden := deltaHidden * Sum;
        Neuron := C.GetFrom;
        deltaWeight := Neuron.GetOutput * deltaHidden;
        C.AdjustWeight(LEARNING_CONSTANT * deltaWeight);
      end;
    end;
  end;
  Result := rResult;
end;

function TNetwork.TrainOnFile(Epochs : Integer ; TrainingFile : string) : Real;
var
  FileT : TStringList;
  Inputss : array of Real;
  Outputss : Real;
  I, C : Integer;
  sTemp : String;
  NumInputs, NumOutputs : Integer;
begin
  // Load File
  FileT := TStringList.Create;
  try
    FileT.LoadFromFile(TrainingFile);
  except
    raise Exception.Create('Training File Does Not Exist');
  end;

  for I := 0 to FileT.Count-1 do
  begin
    sTemp := FileT[I];
    if I = 0 then
    begin
      // get Configurators
      Delete(sTemp,1,Pos(' ',stemp));   // no Longer need training Set count
      NumInputs := StrToInt(Copy(sTemp,1,Pos(' ',sTemp)-1));
      Delete(sTemp,1,Pos(' ',sTemp));
      NumOutputs := StrToInt(Copy(sTemp,1,Length(sTemp)));
      SetLength(Inputss,NumInputs+1);
    end
    else
    begin
      for C := 0 to NumInputs-1 do
      begin
        Inputss[C] := StrToFloat(Copy(sTemp,1,Pos(' ',sTemp)-1));
        Delete(sTemp,1,Pos(' ',sTemp));
      end;
      Outputss := StrToFloat(Copy(sTemp,1,Length(sTemp)));

      Train(Inputss,Outputss);
    end;
  end;
end;

end.

for I := 0 to Connections.Count do

你已经超出了列表的末尾。有效索引是0 to Connections.Count-1包括的。你太过分了。

你反复犯这个错误。当然,你需要到处修复它。

The 列表索引越界当您对集合类执行越界访问时,通常会出现错误,例如TList or TStringList.

另一方面,除非启用了范围检查,否则数组边界错误是不可预测的。如果您这样做,并且您应该这样做,那么您会收到此类事件的运行时错误。您需要启用范围检查。

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

Delphi - 列表索引越界(4) 的相关文章

  • 读写文本文件的最佳方法

    我正在使用最新版本的 Lazarus IDE 并且我有一个Memo1在我的 TForm1 上 我必须加载一个文本文件Memo1然后编辑备忘录的每一行 我使用Memo1 Lines Strings i 最后 我必须将编辑后的备忘录保存在特定路
  • Delphi TListBox iOS 制作新的项目样式/行为

    我需要显示自定义数据 为了example我需要显示包含姓名 描述和照片的联系人列表 理想情况下 我还想在那里显示自定义数据 例如用于发起电话呼叫的按钮 默认样式不太符合我的要求 但相当接近 因此 据我所知 如果我可以创建自定义样式 TLis
  • NvCplGetThermalSettings 返回 false

    问题 您好 我正在尝试使用 Delphi 获取 nividia gtx 980 的 GPU 温度 我看过C 问题 他的解决方案是不使用nvcpl dll 我认为这不是正确的解决方案 因为 nivida 有完整的文档说明如何处理 API 见下
  • iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

    当我从 XCode 运行按钮运行应用程序共享扩展 然后尝试共享文件时 XCode 经常显示以下错误 有人知道是什么原因造成的吗 错误 由于系统完整性保护 无法附加到进程 系统完整性保护 SIP 又名无根 是 OS X 10 11 中的一项新
  • 如何在 Delphi 中更改 TabControl 中活动 TAB 的颜色

    如何更改 TabControl 在 FireMonkey 上 中活动 TAB 的颜色 如下所示 有两种方法可以实现这一点 1 第一个选项是您可以创建定制风格 for 选项卡控件 from T样本 风格设计师 然后您可以添加您想要在自定义设计
  • 构建多线程 TCP/IP 服务器

    我想构建一个可供最多 100 个并发客户端使用的 TCP IP 服务器 但仍不确定如何开始 至少我需要服务器 监听客户端 并将它们全部存储在数组或列表中 对于每个客户端 它需要根据其客户端状态接收和发送数据 当有人连接或断开连接时 服务器应
  • Firemonkey 移动应用程序和远程 MySQL

    我正在使用 Delphi XE5 并且我已经创建了基本的 Firemonkey 移动应用程序 Delphi 我想连接到远程 MySQL 数据库 我应该使用哪一个数据库管道 FireDAC DBExpress 等 您可以使用标准 TSQLQu
  • Delphi 窗体在显示时总是会触发 OnResize 吗?

    如果我创建一个新的 Delphi 表单 挂钩其 OnResize 事件并运行该应用程序 则在显示窗口之前会触发 OnResize 我不知道对于任何窗口来说 这种情况是否总是会发生 对于熟悉 Windows API 的人来说 我已将其追溯到
  • ClientDataset 索引更改时不计算 TAggregateField

    我正在使用连接到 DBGrid 的 TClientDataset 和几个聚合字段 用于计算其他几个浮点字段的总和 所有字段均已在设计时创建 一切都按预期工作 直到 ClientDataset 的 IndexName 使用自定义索引更改 以便
  • Move() 从动态字符串数组中插入/删除项目

    使用 System Move 从字符串数组中插入 删除项目并不像从其他简单数据类型数组中插入 删除项目那么容易 问题是 字符串在 Delphi 中是引用计数的 在引用计数数据类型上使用 Move 需要对内部编译器行为有更深入的了解 这里有人
  • 可以在delphi数据集中创建一个假数据字段吗?

    我想在 DataSet 不是 ClientDataSet 中创建一个 假 数据字段 该字段不应存储在数据库中 它不是计算字段 应允许用户输入输入数据 该字段具有业务逻辑含义 因此用户更新其值后应该更新其他字段 使用 OnFieldChang
  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • 启动时系统托盘图标不出现

    我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标 当我运行程序时 系统托盘图标显示正常 我将应用程序设置为在 Windows 启动时自动启动 当我重新启动计算机时 我的应用程序进程已启动 但系统托盘图标从未出现 我认
  • TControlState.csDesignerHide 与 TControlStyle.csNoDesignVisible

    VCL 似乎提供了两种向表单设计者隐藏控件的机制 TControlState csDesignerHide and TControlStyle csNoDesignVisible 就 IDE 而言 它们之间有什么区别 什么时候应该使用哪个
  • 如何修复 Delphi Prism ASP.NET 错误:“解析器错误消息:‘Oxygene’不是受支持的语言”

    我在 Delphi Prism 中编写了一个 ASP NET Web 应用程序 不是网站 在我的开发机器上一切正常 但是当我将其安装在测试服务器上时 出现以下错误 Server Error in MyApp Application Pars
  • 在主表单之前显示登录表单

    我在表单之间导航时遇到问题 我使用 Delphi XE5 创建了一个 Android Firemonkey 移动应用程序 我目前有一个登录表单和主表单 现在我想要有关如何处理登录表单以显示在主表单之前的建议 在 项目选项 中的表单下 选择要
  • 如何使用 Delphi Sydney 10.4.2 和 Edge Webbrowser 组件获取 HTML SOURCE

    I have TEdgeBrowser在德尔福 10 4 2 中 我想从 HTML 代码中提取基于 RegEx 的字符串 在过去 这是可能的TWebBrowser 仅适用于 IE 11 或更低版本 作为 selectedEngine 但我的
  • 获取字符、整数和日期字段的字段 oldValue 和 newValue

    我试图只保留表更改的历史记录 所以我想获取一个字段在更改为oldValue之前的值 然后获取它更改为newValue的值 两个值都应转换为字符串 因此 这是该表的一个示例 PartNumber Description 12345 Test
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg

随机推荐

  • 是否有与 C# 输出参数等效的 VB.NET?

    VB NET 是否有与 C 直接等效的工具out函数参数 传入函数的变量不需要初始化 不 没有等同的outVB 中的关键字 但是 VB 会自动初始化方法中的所有局部变量 因此您可以使用ByRef无需首先显式初始化变量 Example Sub
  • 如何在使用 Cordova Simulate 时获取 FileEntry 对象

    我正在尝试遵循拍照并获取 FileEntry 对象 https github com apache cordova plugin camera module camera getPictureCordova 相机插件的示例 我正在使用 Co
  • Facebook 图表 API 评论数

    Facebook似乎改变了帖子的结果 几周前可以直接从帖子中读取评论数 https graph facebook com 125909647492772 502974003098530 https graph facebook com 12
  • 在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装

    我使用的是 WiX 3 7 无法让简单的 捆绑元素正常工作 因为它不会带来 Net FX 安装程序包 也不会将其嵌入到 setup exe 中 我已经在我的程序中为此创建了自己的包Bundle wxs文件 但我仍然遇到麻烦 即使机器已经安装
  • 禁止将拍摄的照片保存到 DCIM 文件夹中

    我在我的应用程序中通过 Intent 拍照 照片保存到 SD 上我指定的文件夹中 而且它们也保存到 DCIM 默认相机文件夹中 我不想两次 如何禁止将拍摄的照片保存到此默认相机目录中 先感谢您 这是我正在使用的 Intent intent
  • 刷新div(导致浏览重绘它)

    在 Web 应用程序中 我在动态内容方面遇到了一些麻烦 在 jQuery UI 选项卡控件上方隐藏或显示的表单会导致呈现问题 直到用户将鼠标悬停在选项卡上 然后导致选项卡标题重新绘制正确的位置 它只发生在 IE7 中 作为一个快速破解 我在
  • Mongoose 多更新

    我想用不同的值更新多个文档 我的数据库看起来像这样 id 1 value 50 id 2 value 100 此查询返回错误 因为我传递的是数组而不是 set 中的对象 Model update id in ids set ids valu
  • 为什么 doctype 不自动关闭

    提供了一个 xhtml 文档类型 例如 为什么这个标签本身允许非自关闭 根本不关闭 Aka为什么不是 它不是一个标签 元素 这是一个声明 这就是声明的语法 文档类型声明 http www w3 org TR REC xml sec prol
  • 反应导航选项中“lazyLoad”和“lazy”之间的区别

    我在选项卡更改上重新渲染组件时遇到问题 并且显然添加lazyLoad true导航选项解决了它 但我不太明白它是如何工作的 特别是在那之前 我遇到了另一个问题并添加lazy true选项解决了它 所以我的问题是 两者之间有什么区别以及它们在
  • 更改grep命令的分隔符

    我在用grep检测 a href xxxx something here a 当链接在输入中分成两行时 这不起作用 我想 grep 检查直到它检测到但现在它只是将输入输入到 grep 中 直到检测到新行为止 所以如果输入是这样的 a hre
  • 通过模板参数中的 SFINAE 选择构造函数

    我试图通过 SFINAE 选择一个构造函数 如下所示 template
  • 您可以使用 CASE WHEN THEN 别名进行 GROUP BY 吗?

    我有一个从别名为 Length 的 CASE WHEN THEN 状态 或者可以使用多个 IF 语句 计算的 SELECT 语句 并且我需要将结果正确地分组在一起 SELECT 似乎有效 但该小组将它们分组错误 这是我的声明 SELECT
  • SQL Developer 中查询的快捷方式

    我的同事使用 TOAD 有一个很好的功能 即查询快捷方式 例如 他们编写 get customer info 并且该单词被完整连接查询替换 这个功能对于提高生产力非常有用 我的机器未获得 Toad 许可 并且我使用 Oracle SQL D
  • 如何从 Linux 和 Solaris 上的挂载中提取 NFS 信息?

    我需要使用提取 NFS 挂载信息mount在 Linux RHEL 4 5 和 Solaris Solaris 10 系统上 由于这是 SSH 命令的一部分 因此提取需要在一行中进行 不幸的是 Linux 和 Solaris 在该行的不同部
  • 如何在南迁中访问 auth User 的 User.objects.create_user(...) ?

    我没有使用 django 的 auth 模块 而是使用了自己的模块 并且已经非常后悔了 为了纠正这种情况 我正在尝试将数据从我的用户模型迁移到 django auth models User 我创建了一个数据迁移 如下所示 def forw
  • WPF C# - 计时器倒计时

    如何在用 WPF C 编写的代码中实现以下内容 我有一个 ElementFlow 控件 在其中实现了 SelectionChanged 事件 该事件 根据定义 在控件的项目选择发生更改时触发特定事件 我想要它做的是 启动计时器 如果计时器达
  • 尽管我可以使用 Visual Studio 检查它,但 selenium Web 元素上的文本属性为空

    在没有发布 C 代码和标记页面的情况下 是否有人知道此代码的原因 var link driver FindElement By Id field Field var id link GetAttribute id var text link
  • 如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

    我将ojdbc6 jar复制到tomcat安装文件夹中的lib文件夹中 当我部署在 JDBC 连接中使用 Oracle 驱动程序的 Web 应用程序时 服务器说找不到驱动程序类 我被迫手动执行 DriverManager registerD
  • 如何在终端中显示图像?

    是否有任何类型的实用程序可以用来将图像转换为 ASCII 然后在我的终端中打印 我寻找过 但似乎没有找到 一个名为cacaview http linux die net man 1 cacaview允许您执行此操作 它是交互式的 允许您平移
  • Delphi - 列表索引越界(4)

    我知道这个问题已经被提出了一百万次 但是 我无法理解为什么这段代码会抛出错误 我已经找到了导致错误的罪魁祸首 FOR 循环 但是 我没有看到它有任何问题 我收到错误 列表索引超出范围 4 function TNetwork FeedForw