Форум «Всё о Паскале» _ Написание игр _ Pascal. Ошибка в программе. Exitcode = 201.
Автор: SaheR 26.08.2013 20:32
Здравствуйте, уважаемые программисты, администраторы, пользователи и т.д. Суть программы: меню для игры. Столкнулся с Exitcod'ом 201. Вылет происходит при использовании цикла чтения из текстового файла и присваивания строк файла массиву. Что-то я делаю явно не так, вопрос - что? Собственно, ниже код. Прошу прощения, если форматирование текста кода не является удобночитаемым. Пишу на Free Pascal, желательно, чтобы программа компилировалась и на Borland Pascal 7.0. Благодарю за внимание.
Спойлер(Показать/Скрыть)
program Menu;
uses crt;
const strt=36; //в константах записаны позиции пунктов "Старт", "Справка" и "Выход" для GoToXY hlp=35; ext=36;
var arrlevels: array [0..13] of string; //массив хранения имён(названий файлов) уровней levelname: string; i,j:integer; //счётчики keyCode,scanCode:string[2]; menuselect: char; //переменная, отвечающая за выделенный пункт меню exitprogram: boolean; // -||-||- за выход из программы lvlpath: text; //файловая переменная, отвечает за файл с именами уровней
procedure rendS; //отрисовка пункта "Старт" begin if menuselect='s' then begin gotoxy(strt,13); write('->Старт<-'); end else begin gotoxy(strt+2,13); write('Старт'); end; end;
procedure rendH; //отрисовка пункта "Справка" begin if menuselect='h' then begin gotoxy(hlp,15); write('->Справка<-'); end else begin gotoxy(hlp+2,15); write('Справка'); end; end;
procedure rendE; //отрисовка пункта "Выход" begin if menuselect='e' then begin gotoxy(ext,17); write('->Выход<-'); end else begin gotoxy(ext+2,17); write('Выход'); end; end;
procedure rendermenu; //отрисовка всего меню begin clrscr; rends; rendh; rende; gotoxy(80,25); //убрать курсор в угол, чтоб не мешал взору end;
procedure levels; //!!! Проблемная процедура. Должна оторажать список уровней. begin assign(lvlpath, 'level.txt'); //подключение файла с названиями уровней clrscr; reset(lvlpath); i:=0; //моя прихоть repeat //цикл, заносящий построчно в массив arrlevels имена уровней из файла i:=i+1; read(lvlpath, levelname); arrlevels[i]:= levelname; gotoxy(7, i*2); write(levelname); until eof(lvlpath); //Если делать eof=true, то просто пролетает цикл, если false, то Exitcode = 201 при переходе на цикл end;
procedure keyread; //процедура, отвечающая за перемещение по первичному меню(Старт, Справка, Выход) begin keyCode := ReadKey; case keyCode of #0 : begin scanCode := ReadKey; case scanCode of #80: begin //вниз case menuselect of 's': menuselect:='h'; 'h': menuselect:='e'; 'e': menuselect:='s'; end; end;
#72: begin //вверх case menuselect of 's': menuselect:='e'; 'h': menuselect:='s'; 'e': menuselect:='h'; end; end; end; end; #13: begin //Enter if menuselect='e' then exitprogram:=true; //Если "Выход", то выходим if menuselect='h' then begin //Если "Справка", показываем её clrscr; gotoxy(10,5); write('Здесь будет описание игры. И Ваша реклама. Наверное.'); readln; end; if menuselect='s' then levels; //Если "Старт", то показываем список уровней end; end; end;
begin //запуск программы exitprogram:=false; //переменная, отвечающая за выход из программы menuselect:='s'; //начальный выбранный пункт в меню rendermenu; //отрисовка меню repeat //цикл перемещения по меню keyread; rendermenu; until exitprogram=true; close(lvlpath); end.
Автор: Ромаха 28.08.2013 8:47
Добрый день. Для начала стоит освежить знания о Run-time errors. А точнее вспомнить что ж за зверь такой 201 и с чем его едят.. 201 Range check error If you compiled your program with range checking on, then you can get this error in the following cases: An array was accessed with an index outside its declared range. Trying to assign a value to a variable outside its range (for instance an enumerated type).
То есть выход за пределы. Начать нужно с того, что или Вы даете нам какой-нить уровень (чтобы не было exitcode = 2). Или Вы пошагово пытаетесь выйти на ошибку..
Удачи!
Автор: SaheR 28.08.2013 14:52
Цитата(Ромаха @ 28.08.2013 11:47)
Добрый день. Для начала стоит освежить знания о Run-time errors. А точнее вспомнить что ж за зверь такой 201 и с чем его едят.. 201 Range check error If you compiled your program with range checking on, then you can get this error in the following cases: An array was accessed with an index outside its declared range. Trying to assign a value to a variable outside its range (for instance an enumerated type).
То есть выход за пределы. Начать нужно с того, что или Вы даете нам какой-нить уровень (чтобы не было exitcode = 2). Или Вы пошагово пытаетесь выйти на ошибку..
Удачи!
Спасибо за напоминание, но я написал сюда уже от беспомощности т.к. и не нашёл, где происходит выход за пределы массива. Файл level.txt должен содержать просто названия уровней, которые уже в будущем будут загружаться из одноимённых файлов. Собственно, из-за
gotoxy(7, i*2);
в этом файле должно быть не более 12 строк. На данный момент, у меня в этом файле находится всего четыре строчки, в каждой по одному слову(если нужно, уточню - в английской раскладке). Когда впервые с этой ошибкою встретился в данном коде, то даже массив arrlevels сделал с индексами от 1 до 150. Благодарю за пожелание удачи :3
Автор: SaheR 28.08.2013 15:19
Всё, ошибку свою нашёл. Вместо readln, при чтении с файла, использовал read.