我写了一段数值分析的算法,报错:
Project xlyc.exe faulted with message :'access violation at 0x004068a1:write of address ox00030d54.' process Stopped.........
程序如下:
unit Ufm_zxpf;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls, ComCtrls, ButtonComps, ExtCtrls,
  dxCntner, dxTL, dxDBCtrl, dxDBGrid, XPMenu;type
  Tfm_zxpf = class(TForm)
    Database1: TDatabase;
    Label1: TLabel;
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    Label2: TLabel;
    Label3: TLabel;
    SquareButton1: TSquareButton;
    qry_pf: TQuery;
    XPMenu1: TXPMenu;
    dxDBGrid1: TdxDBGrid;
    Bevel1: TBevel;
    ds_pf: TDataSource;
    dxDBGrid1Column1: TdxDBGridColumn;
    dxDBGrid1Column2: TdxDBGridColumn;
    dxDBGrid1Column3: TdxDBGridColumn;
    Bevel2: TBevel;
    Mm_pf: TMemo;
    procedure FormShow(Sender: TObject);
    procedure SquareButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  fm_zxpf: Tfm_zxpf;
  XL : Array of Real; //销量
  T  : Array of Real; //时间
  tx : Array of Real; //XL*T
  t2 : Array of Real; //T*T
  XLSUM : Real;
  TSUM  : Real;
  TXSUM : Real;
  T2SUM : Real;
  A,B,SUM  : Real;implementation{$R *.dfm}procedure Tfm_zxpf.FormShow(Sender: TObject);
begin
  XPMenu1.Active := False;
  XPMenu1.Active := False;
  DateTimePicker1.DateTime := Now;
  DateTimePicker2.DateTime := Now;
end;procedure Tfm_zxpf.SquareButton1Click(Sender: TObject);
var
  QSNY,ZZNY: String; //起始年月,终止年月
  I,J,K,L  : Integer;
begin
  QSNY := FormatDateTime('YYYYMM',DateTimePicker1.DateTime);
  ZZNY := FormatDateTime('YYYYMM',DateTimePicker2.DateTime);
//判断月份是否是奇数//打开数据
  Try
    if qry_pf.Active = True then qry_pf.Active := False;
    with qry_pf do
    begin
      ParamByName('GSDW').AsString := '11640201';
      ParamByName('QSNY').AsString := QSNY;
      ParamByName('ZZNY').AsString := ZZNY;
      ParamByName('ZGRY').AsString := '2000';
      Active := true;
    end;
  Except
    ShowMessage('读取数据失败!');
  End;
//从数据库中取数据插入数组
  I := qry_pf.RecordCount;
  SetLength(XL,I);
  SetLength(T,I);
  SetLength(tx,I);
  SetLength(t2,I);
  J := 0;
//得到数组XL
  with qry_pf do
  begin
    First;
    while not eof do
    begin
      XL[J] := StrToFloat(FieldByName('XL0000').AsString);
      J := J + 1;
      Next;
    end;
  end;
//得到数组T
  for j := 0 to qry_pf.RecordCount do
    t[j] := j + 1;
//得到数组TX
  for j := 0 to qry_pf.RecordCount do
    tx[j] := XL[J]*T[j];
//得到数据T2
  for j := 0 to qry_pf.RecordCount do
    t2[j] := t[j]*t[j];
//计算各项和
  XLSUM := 0;
  for j :=0 to Length(XL) do
    XLSUM := XLSUM + XL[J];
  TSUM := 0;
  for j :=0 to Length(T) do
    TSUM := TSUM + T[J];
  TXSUM := 0;
  for j :=0 to Length(TX) do
    TXSUM := TXSUM + TX[J];
  T2SUM := 0;
  for j :=0 to Length(T2) do
    T2SUM := T2SUM + T2[J];
//预测销量
  B := (TXSUM*I-XLSUM*TSUM)/(I*T2SUM-TSUM*TSUM);
  A := (XLSUM-B*TSUM)/I;
  for J :=0 to I do
  begin
    sum := 0;
    sum := A + B*(j+1);
    Mm_pf.Lines.Add(FloatToStr(sum));
  end;
end;end.

解决方案 »

  1.   

    for j :=0 to Length(XL) do
        XLSUM := XLSUM + XL[J];更改:
    for j :=0 to Length(XL)-1 do
        XLSUM := XLSUM + XL[J];现在看也看不出来.就像楼上说的你用断点先把范围缩小了看.
      

  2.   

    jinjazz(近身剪(N-P攻略)) 抢楼真快^_^
      

  3.   

    补一下:  ksaiy(消失在人海-喜欢昆明的花)  也强!
      

  4.   

    回复人: hottey(点亮心灵)(基础补习中) ( ) 信誉:100  2004-11-08 18:29:00  得分: 0  
     
     
       补一下:  ksaiy(消失在人海-喜欢昆明的花)  也强!
      
     
    ============================
    何止是强啊,牛人一个
      

  5.   

    多谢各位,可是我设置了断点跟踪了!一直到Tfm_zxpf.SquareButton1Click全部执行完都没有问题!然后我点了F9,就报错了!·