Столкнулся с одной проблемой, 2 дня уже бьюсь... что делать - не знаю... Если коротко, то дело вот в чем. Я написал процедуру для подсчета определителя матрицы любого порядка (методом Гаусса). И там над матрицей выполняются различные преобразования (складывания строк и т.д.). Причем - внимание - по условию задания матрица должна быть обязательно динамической! Процедура работает нормально, определитель находит, НО в то же время изменяет исходную матрицу, а этого нельзя допустить!! Происходит это, как мне кажется, из-за того, что такие матрицы - ссылки на память, поэтому передать ее в процедуру строго по значению нельзя...
Замучился я с этими динамическими структурами... Please, умные люди, help me!
P-Tigr, небольшая поправочка: Выход за пределы массива тут ни при чем...
Сейчас еще раз прогнал твою программу... Вот посмотри на скриншот, который я сделал в определенный момент. Как ты думаешь, что произойдет на следующем шаге?
Я думаю, что деление на 0...
Это в принципе ясно, ведь если у тебя матрица: 1, 1, 1 1, 1, 1 1, 1, 1 то после вычитания первой строки из второй и из третьей, она становится такой: 1, 1, 1 0, 0, 0 0, 0, 0 и далее как только ты пытаешься найти множитель для вычитания 3-ей строки из второй - Oops "Деление на ноль". Но ведь на самом-то деле его и искать не надо... Матрица уже приведена к треугольному виду... Я думаю, надо добавить проверку, не являются ли первые N символов строки N нулевыми, т.е. не является ли данная строка уже строкой подходящей для треугольной матрицы...
Добавлено: Ну или вот так (взято из реализации trminator-а отсюда: Определитель матрицы ):
function Opred_Gauss(A:TDMAtr):real; // Описание переменных... const eps = 1e-10; begin { Это то самое копирование матрицы } setlength(ac, length(a)); for i := 0 to pred(length(a)) do begin setlength(ac[i], length(a[i])); for j := 0 to pred(length(a[i])) do ac[i, j] := a[i, j] end;
{ А теперь - сам алгоритм } for i := 0 to high(AC) do begin if abs(aс[i,i])<eps then begin result :=0.0; exit end; for j := succ(i) to high(AC) do begin mnoj:=a[j,i]/a[i,i]; for jk:=i to high(AC) do a[j,jk]:=a[j,jk]-d*a[i,jk]; end; end; result := 1.0; for i:=1 to high(AC) do result:=result*a[i,i]; end;