![]() |
|
|
Регистрация | << Правила форума >> | 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 значения.
jmp $ ; Happy End! The Cake Is A Lie. |
#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. |
#7
|
||||
|
||||
![]() Цитата:
icWasya, э, код оформи как положено! — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#8
|
|||
|
|||
![]() Цитата:
![]() |