Пытаюсь скомпилировать: Програма должна выяснить если существует путь в лабиринте от точки А к Б.
COD(Показать/Скрыть)
Program Lab; Uses Crt; const maxn=30; dx:array[1..4] of integer=(-1,0,1,0); dy:array[1..4] of integer=(0,-1,0,1); var A:array[1..maxn+1, 1..maxn+1] of integer; n,m, sx,sy, fx,fy:integer; F:text; OK:boolean; procedure Initializare; var i,j:integer; begin for i:=0 to maxn+1 do for j:=0 to maxn+1 do a[i,j]:=1; write('Dati n si m: '); readln(n,m); for i:=1 to n do for j:=1 to m do begin write('a[',i,',',j,']='); readln(a[i,j]); writeln; end; write('Dati coordonatele punctului A: '); readln(sx,sy); write('Dati coordonatele punctului B: '); readln(fx,fy); readln; end; {Init} procedure Search(x,y,k:integer); var i:integer; begin OK:=True; if (x=fx) and (y=fy) then begin writeln('DA, drum exista'); OK:=False; readln; Halt; end else for i:=1 to 4 do if a[y+dy[i], x+dx[i]]=0 then Search(x+dx[i], y+dy[i], k+1); end; Begin ClrScr; Initializare; search(sx,sy,1); if OK then writeln('NU exista drum'); readln; end.
Пишет что NTVDM нашла недопустимую инструкцию. Погуглил, поискал на форуме, способа решение нашел два : перейти на 32-бит компилятор или сменить ОСь. Но ошибка только в этой програме, пробовал запустить ранее сохраненые, и быстро понаписал "Hello World" и другие мини-програмы, всё работает, тогда причем тут MS-DOS?
TarasBer
7.04.2011 21:01
ДОС ни при чём. Ошибка в твоей программе. Нажми Options->Compiler и поставь там контроль переполнения стека и контроль выхода за пределы массива.
Просто у тебя программа из-за ошибки затирает код, и на месте кода получается та самая недопустимая инструкция. Да, в защищённой оси (в том числе в винде) программа не будет молча затирать код, она выдаст ошибку записи (защита памяти на уровне процессора). Но работать всё равно не будет. Так что сначала отладь программу.
DarkWishmaster
7.04.2011 21:07
Цитата(TarasBer @ 7.04.2011 17:01)
ДОС ни при чём. Ошибка в твоей программе. Нажми Options->Compiler и поставь там контроль переполнения стека и контроль выхода за пределы массива.
Просто у тебя программа из-за ошибки затирает код, и на месте кода получается та самая недопустимая инструкция. Да, в защищённой оси (в том числе в винде) программа не будет молча затирать код, она выдаст ошибку записи (защита памяти на уровне процессора). Но работать всё равно не будет. Так что сначала отладь программу.
Спасибо! Ошибка было в том что у меня array[1..maxn, 1..maxn] а барьер я заполняю с for i:=0 ... как я этого не заметил...
volvo
7.04.2011 21:21
Цитата
а барьер я заполняю с for i:=0 ... как я этого не заметил...
Если программа компилируется с включенной опцией Range Checking (я уже устал говорить об этом /в самом низу поста/... Не хотите слушать - ловите ошибки дальше), то все, что произойдет - это вылет с указанием места ошибки.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.