Суть программы: меню для игры.
Столкнулся с 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.