首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

access violation at 0X00000000:read of address 0X00000000如何解决

2012-04-13 
access violation at 0X00000000:read of address 0X00000000怎么解决?代码和函数定义如下,运行后会产生如

access violation at 0X00000000:read of address 0X00000000怎么解决?
代码和函数定义如下,运行后会产生如题的错误,不知怎么解决,请高手指教!

运行:
procedure   TForm2.Button1Click(Sender:   TObject);
var
G1:Tgraph;
v,t:integer;

begin
    v:=   StrToInt(Edit2.Text);//数字
    t:=   StrToInt(Edit3.Text);//数字
    CreateGraphic(G1);
    ShortestPath(G1,   v,   t);
    Post(R,G1);
end;


函数定义:
procedure   CreateGraphic(G:TGraph);
var
    i,j:integer;
begin
    Form2.ADOQuery2.Active:=   True;
    Form2.ADOQuery2.First;
    G.n:=   Form2.ADOQuery2.RecordCount;
    for   i:=   0   to   (G.n   -   1)     do
        begin
            G.Vexs[i]:=   i;
            for   j:=   0   to   (G.n   -   1)   do
                begin
                    if     IntToStr(Form2.ADOQuery2.Fields[j].AsInteger)   =   #0   THEN
                    G.Edges[i,j]:=1000
                    else
                    G.Edges[i,j]:=   Form2.ADOQuery2.Fields[j].AsInteger;

                end;
            Form2.ADOQuery2.Next;
        end;

        for   i:=   0   to   (G.n   -   1)     do
        begin
            for   j:=   0   to   (G.n   -   1)   do
                begin
                    if   G.Edges[i,j]   =   0   then   G.Edges[i,j]:=   1000;

                end;
        end;


end;


procedure   ShortestPath(G:TGraph;   v0,v1:integer);
var
i,j,v,k,min,Max:   integer;
P:   Array[0..39,0..39]   of   integer;
Final:   Array[0..39]   of   boolean;
D:   Tarr1;
begin
   
      Max:=0;
      for   i:=0   to   (G.n   -   1)   do
      begin
            D[i]:=   G.Edges[v0,i];
            Final[i]:=   False;
            for   k:=   0   to   (G.n   -   1)   do
                begin
                    p[i,k]:=   0;
                    if   (D[i]   <   1000)   then
                        begin
                            P[i,v0]:=   1;
                            P[i,i]:=   2;


                        end;
                end;
      end;

      D[v0]:=   0;
      final[v0]:=   True;

    for   i:=0   to   (G.n   -   1)   do
        begin
              min:=1000;
              for   j:=0   to   (G.n   -   1)   do
                begin
                    if   not   final[j]   then
                        begin
                            if   D[j]   <   min   then
                                begin
                                    v:=   j;
                                    min:=   D[j];
                                end
                            else
                            ShowMessage( '路径信息可能有错误,请检查! ');
                        end;
                end;

            final[v]:=   True;

            for   j:=0   to   (G.n   -   1)   do
                begin
                        if   (not   final[j])   and   ((min   +   G.Edges[v,   j])   <   (D[j]))   then
                            begin
                                D[j]:=   min   +   G.Edges[v,   j];
                                for   k:=   0   to   (G.n   -   1)   do
                                begin
                                    P[j,k]:=P[v,k];
                                end;


                                for   k:=   0   to   (G.n   -   1)   do           //取得最大的序号,
                                    begin


                                        if   P[j,   k]   >   Max   then   Max:=   P[j,   k];
                                    end;
                                p[j,   j]:=   Max   +1;
                            end;

                end;


        end;

        for   k:=   0   to   (G.n   -   1)   do
            begin
                R[k]:=   P[v1,k];
            end;

end;

procedure   Post(arr1:Tarr1;g1:Tgraph);
var
i,j,k:integer;
begin

    for   i:=0   to   (g1.n   -   1)   do
    begin
        for   j:=   0   to   (g1.n   -   1)   do
            begin
                if   arr1[j]   =   (i   +   1)   then
                    begin
                          k:=   i   +   1;
                          Form2.ADOQuery1.AppendRecord([MyStr,k,0,1,0,j,1,1]);
                    end;
            end;

    end;


end;



[解决办法]
这种错误,别人没那么多耐心去看你的代码的,自己调试一下很快就可以知道错误在哪了。所有的地址引用错误都是引用了已经free掉或未create的对象,或是指针指向了非法的地址.你的程序里没有直接地址操作,那就一定是引用了对象的时候它不存在.调试的时候看哪句报错,检查这句代码里的所有对象哪个没有存在或已经free了就ok了。

热点排行