Компилятор крашится при компиляции модуля - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д