![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем доброго времени суток. Пишу я программу для решения слау над полем простых чисел (но это не суть).
Проблема моя связана с тем что при заполнении последней строки массива программа крашится и выдает: Exception EAccessViolation in module Gauss.exe at 0000A340. Access violation at address 0040A340 in module 'Gauss.exe'. Write of address 000 00000. В чем дело никак не пойму. Код программы. Код:
program Gauss;
{$APPTYPE CONSOLE}
uses
SysUtils,
math,
windows;
var n,i,j,m,p:integer;
b:array of integer;
x:array of integer;
a:array of array of integer;
function Zetta(z: integer):integer;
begin
If z>=p then Zetta:=z mod p;
If z<0 then Zetta:=p-(abs(z) mod p);
end;
begin
setconsoleoutputcp(1251);
setconsolecp(1251);
write('Введите чиcло p: ');readln(p);
write('Введите число уравнений: ');readln(m); m:=m-1;
write('Введите число неизвестных: ');readln(n); n:=n-1;
SetLength(a,m,n);
SetLength(b,m);
SetLength(x,n);
writeln;
writeln('A*X = B');
writeln;
for i := 0 to m do
begin
for j := 0 to n do
begin
write('A[',i+1,',',j+1,'] = '); readln(a[i,j]);
a[i,j]:=Zetta(a[i,j]);
end;
write('B[',i+1,'] = '); readln(b[i]);
b[i]:=Zetta(b[i]);
end;
readln
end. |
|
#2
|
||||
|
||||
|
0 to m-1, 0 to n-1, потом что количество элементов от 0 до m равно m + 1: если m = 2, то цикл пройдет значения 0,1,2, т.е. 3 значения.
|
|
#3
|
|||
|
|||
|
но в 23,24 строках m и n итак на 1 уменьшаются.
|
|
#4
|
||||
|
||||
|
Они просто задают размерность массива на одну ячейку меньше, а в цикле перебора всё равно происходит выход из диапазона
|
|
#5
|
||||
|
||||
|
SetLength c тремя аргументами в первый раз вижу...
Исправил вот на такое - не падлает ![]() Код:
program Gauss;
{$APPTYPE CONSOLE}
uses
ExceptionLog,
SysUtils,
math,
windows;
var n,i,j,m,p:integer;
b:array of integer;
x:array of integer;
a:array of array of integer;
function Zetta(z: integer):integer;
begin
If z>=p then Zetta:=z mod p;
If z<0 then Zetta:=p-(abs(z) mod p);
end;
begin
setconsoleoutputcp(1251);
setconsolecp(1251);
write('Введите чиcло p: ');readln(p);
write('Введите число уравнений: ');readln(m); m:=m-1;
write('Введите число неизвестных: ');readln(n); n:=n-1;
SetLength(a,m);
for i := Low(a) to High(a) do
SetLength(a[i],n);
SetLength(b,m);
SetLength(x,n);
writeln;
writeln('A*X = B');
writeln;
for i := Low(a) to High(a) do
begin
for j := Low(a[i]) to High(a[i]) do
begin
write('A[',i+1,',',j+1,'] = '); a[i,j]:=Random(10);
a[i,j]:=Zetta(a[i,j]);
end;
write('B[',i+1,'] = '); b[i]:=Random(20);
b[i]:=Zetta(b[i]);
end;
Readln;
end. |
|
#6
|
|||
|
|||
|
вот это
Код:
SetLength(a,m);
for i := Low(a) to High(a) do
SetLength(a[i],n);Код:
SetLength(a,m,n); ![]() А первый вариант модно использовать, когда массив -не прямоугольный, то есть в разных строках - разное количество элементов. К тому же надо добавить печать элементов массивов надо так Код:
38 write('A[',i+1,',',j+1,'] = '); a[i,j]:=Zetta(Random(10));
39 writeln(a[i,j]);
и
41 write('B[',i+1,'] = '); b[i]:=Zetta(Random(20));
42 writeln(b[i]);Последний раз редактировалось M.A.D.M.A.N., 17.02.2015 в 11:38. |