Компилятор крашится при компиляции модуля - PascalABC.NET
Формулировка задачи:
Доброго времени суток.
Задача состоит в создании модуля для работы с данными о студентах.
Если что, модуль доработан не до конца(скажем так, остается навести красоты, но это не касается темы проблемы). Хотел проверить, нет ли где-нибудь ошибок путем компиляции. Так вот, при нажатии кнопки "Компилировать" PascalABC.Net крашится. Попытался разобраться в чем проблема, и, кажется, понял, что беда в строке(попробовал ее просто закомментировать, и компиляция пошла, начало указывать на незнакомое имя list):
В связи с этим пара вопросов: могу ли я задавать динамическим массивам свой тип? И правильно ли я объявил данный массив? Заранее спасибо!
Решение задачи: «Компилятор крашится при компиляции модуля»
textual
Листинг программы
unit Stud;
interface
type
//шаблон данных о студентах
students = record
number: integer;
name: string[50];
group: string[25];
age: integer;
end;
arrtype = array of students;
procedure add(s: string; var k: smallint);
procedure search(s: string; num: smallint; k: smallint);
procedure redaction(s: string; k: smallint);
procedure del(s: string; var k: smallint);
procedure welcome;
implementation
var
list: arrtype;
procedure welcome;
var
s: string[200];
s1: string[30];
k: integer;
i: byte;
begin
k := 1;
setlength(list, k); //устанавливаем длину массива записей
while(s <> 'Выход') do
begin
writeln('"Если Вы желаете добавить информацию о студенте, то введите следующую форму:"');
writeln('"Добавить <фамилия студента> <возраст> <название группы>"');
writeln('"Если Вы желаете редактировать информацию о студенте, то введите следующую форму:"');
writeln('"Редактировать <фамилия студента> <новое значение возраста> <новое название группы>"');
writeln('"Если Вы желаете удалить информацию о студенте, то введите следующую форму:"');
writeln('"Удалить <номер студента,информацию о котором надо удалить>"');
writeln('"Если Вы желаете запросить информацию о студенте, то введите следующую форму:"');
writeln('"Запрос <фамилия студента>" или "Запрос <номер студента>"');
writeln('Если Вы желаете выйти, то введите "Выход".');
readln(s);
s := trim(s);//удаляем все начальные и конечные пробелы
i := pos(' ', s);//ищем позицию первого пробела
s1 := copy(s, 1, i - 1);//копируем слово из s в s1 до первого пробела
delete(s, 1, i);//удаляем из s первое слово
(*
case s1 of
'Добавить': add(s, k);
'Удалить': del(s, k);
'Редактировать': redaction(s, k);
'Запрос': search(s);
else
begin
writeln('Некорректный ввод');
//welcome;
end;
end;
*)
end;
end;
//процедура добавления информации о студентах
procedure add(s: string; var k: smallint);
var
s1: string;
a: byte;
b, c: integer;
begin
setlength(list, k); //устанавливаем длину массива записей
//выделение фамилии и добавление ее в информацию о студенте
a := pos(' ', s);
s1 := copy(s, 1, a - 1);
delete(s, 1, a);
list[k - 1].name := s1;
//выделение возраста студента и добавление его в информацию
a := pos(' ', s);
s1 := copy(s, 1, a - 1);
delete(s, 1, a);
val(s1, b, c);
while (c <> 0) do
begin
writeln('Возраст введен неккоретно, введите еще раз.');
val(s1, b, c);
end;
list[k - 1].age := b;
//добавление номера группы
list[k - 1].group := s;
//добавление порядкового номера студента
list[k - 1].number := k;
inc(k);
end;
//процедура удаления информации о студенте с заданным номером
procedure del(s: string; var k: smallint);
var
a: smallint;
b, c: integer;
begin
//выделение номера студента для удаления
val(s, b, c);
while (c <> 0) do
begin
writeln('Номер введен неккоретно, введите еще раз.');
val(s, b, c);
end;
a := b;
//поиск студента с введенным номером
for b := 0 to k - 1 do
if list[b].number = a then c := b;
//перенос информации о других студентах
for b := c to k - 2 do
list[b] := list[b + 1];
//уменьшаем длину массива записей на одну
dec(k);
setlength(list, k);
end;
//процедура редактирования информации о студенте
procedure redaction(s: string; k: smallint);
var
s1: string[50];
a, b: smallint;
c: byte;
err : integer;
begin
c := pos(' ', s);
s1 := copy(s, 1, c - 1);
delete(s, 1, c);
for a := 0 to k - 1 do
if list[a].name = s1 then b := 0;
c := pos(' ', s);
s1 := copy(s, 1, c - 1);
delete(s, 1, c);
val(s, c, err);
list[a].age := c;
list[a].group := s;
end;
procedure search(s: string; num: smallint; k: smallint);
var
a, b: smallint;
begin
if s <> '' then
begin
for a := 0 to k - 1 do
if list[a].name = s then // a := b;
end
else
begin
for a := 0 to k - 1 do
if list[a].number = num then // a := b;
end;
end;
end.
Объяснение кода листинга программы
- unit Stud; - определяет модуль Stud, который содержит все описанные ниже процедуры и переменные
- interface - определяет интерфейс модуля Stud
- type - определяет типы данных, используемые в модуле Stud
- students = record - определяет структуру данных о студентах
- number: integer; - номер студента
- name: string[50]; - имя студента
- group: string[25]; - название группы студента
- age: integer; - возраст студента
- arrtype = array of students; - определяет тип массива для хранения структур данных о студентах
- procedure add(s: string; var k: smallint); - определяет процедуру добавления информации о студенте
- procedure search(s: string; num: smallint; k: smallint); - определяет процедуру поиска информации о студенте по фамилии или номеру
- procedure redaction(s: string; k: smallint); - определяет процедуру редактирования информации о студенте
- procedure del(s: string; var k: smallint); - определяет процедуру удаления информации о студенте
- procedure welcome; - определяет процедуру приветствия и получения команд от пользователя
- var - определяет переменные, используемые в модуле Stud
- list: arrtype; - определяет массив для хранения информации о студентах
- implementation - определяет реализацию модуля Stud
- var - определяет дополнительные переменные, используемые в реализации модуля Stud
- k: integer; - определяет переменную для хранения текущего размера массива list
- welcome; - вызывает процедуру приветствия и получения команд от пользователя
- while(s <> 'Выход') do - выполняет цикл, пока пользователь не введет 'Выход'
- begin - начинает выполнение блока кода
- writeln('
Если Вы желаете добавить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о студенте - writeln('
Добавить <фамилия студента> <возраст> <название группы>'); - выводит пример ввода информации о студенте - writeln('
Если Вы желаете редактировать информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о редактировании студента - writeln('
Редактировать <фамилия студента> <новое значение возраста> <новое название группы>'); - выводит пример ввода информации о редактировании студента - writeln('
Если Вы желаете удалить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о удалении студента - writeln('
Удалить <номер студента,информацию о котором надо удалить>'); - выводит пример ввода информации о удалении студента - writeln('
Если Вы желаете запросить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода запроса информации о студенте - writeln('
Запрос <фамилия студента>илиЗапрос <номер студента>'); - выводит пример ввода запроса информации о студенте - end; - заканчивает выполнение блока кода
- end. - завершает определение модуля Stud