Столкнулся с одной проблемой, 2 дня уже бьюсь... что делать - не знаю... Если коротко, то дело вот в чем. Я написал процедуру для подсчета определителя матрицы любого порядка (методом Гаусса). И там над матрицей выполняются различные преобразования (складывания строк и т.д.). Причем - внимание - по условию задания матрица должна быть обязательно динамической! Процедура работает нормально, определитель находит, НО в то же время изменяет исходную матрицу, а этого нельзя допустить!! Происходит это, как мне кажется, из-за того, что такие матрицы - ссылки на память, поэтому передать ее в процедуру строго по значению нельзя...
Замучился я с этими динамическими структурами... Please, умные люди, help me!
function Opred_Gauss(A:TDMAtr):real; var i,j,jk,ik,new:integer; tmp,mnoj,mn1,mn2:real; found:boolean; AC:TDMAtr; begin AC:=A; A:=nil; // проверили равность определителя нулю for j:=0 to high(AC) do if AC[j,j]=0 then begin found:=false; For new:=0 to high(AC) do if AC[new,j]<>0 then begin for jk:=0 to high(AC[new]) do begin tmp:=AC[j,jk]; AC[j,jk]:=AC[new,jk]; AC[new,jk]:=tmp; end; found:=true; break; end; if not found then begin Result:=0; Exit; End; end; // приволим матрицу у верхне-треугольному виду {(все эл-ты под главной диагональю сделаем = 0)} for j:=0 to high(AC)-1 do begin for i:=j+1 to high(AC) do begin mn1:=AC[i,j]; mn2:=AC[j,j]; mnoj:=mn1/mn2; for jk:=0 to high(AC) do begin AC[i,jk]:=AC[i,jk]-AC[j,jk]*mnoj; end; end; end; Result:=1; For i:=0 to high(AC) do Result:=Result*aC[i,i]; end;
{<--------------------------------------------->} {процедура обработки: поместить определитель в глав. диагональ и потом отразить все эл-ты симметрич. относ. глав. диагонали}
procedure Work_Matr(a:TDMatr; var b:TDMatr); var opred,tmp:real; i,j,tmpi:integer; begin b:=nil; SetLength(b,length(a),length(a)); for i:=0 to high(a) do for j:=0 to high(A) do begin tmp:=a[i,j]; b[i,j]:=tmp; end;
opred:=Opred_Gauss(a); b[0,0]:=opred; {for i:=1 to high( B ) do begin for j:=0 to i-1 do begin tmp:=b[i,j]; tmpi:=i-j; b[i,j]:=b[i-tmpi,j+tmpi]; b[i-tmpi,j+tmpi]:=tmp; b[i,i]:=opred; end; end;} end;
{<--------------------------------------------->}
вроде все... здесь А - исходная матрица В - полученная