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了。