Найти ошибку в модуле работы с множествами - Free Pascal
Формулировка задачи:
Есть модуль для работы с множествами:
И есть программа, работающая с ним. Например:
При попытке вывода элементов выбивает ошибку, связанную с памятью. Но я не могу понять, где именно ошибка. Подскажите, пожалуйста. Понимаю, что где-то в процедуре создания массива, но где именно?
unit sets_3;
interface
type
t_mass = array[1..65520 div sizeof(boolean)] of boolean;
t_p_mass = ^t_mass;
procedure create_mass(ku: word; var ka: word; a: t_p_mass);
procedure create_empty_mass(ku: word; var a: t_p_mass; ka: word);
procedure universe(ku: word; var u: t_p_mass);
function equality(ku: word; a,b: t_p_mass): boolean;
function inclusion(ku: word; a,b: t_p_mass): boolean;
function str_inclusion(ku: word; a,b: t_p_mass): boolean;
procedure association(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
procedure cross(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
procedure difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
procedure smc_difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
procedure addition(ku: word; a: t_p_mass; var c: t_p_mass; kc: word);
implementation
//ka,kb,kc,ku - число элементов множества a,b,c,u соответственно.
var
i,t: word;
a,b,c,u: t_p_mass;
ka,kb,kc,ku: word;
procedure create_mass;
//Процедура создания динамического массива типа t_p_mass в памяти и ввода его значений.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: A - массив, хранящий элементы множества A.
var
i,j: word;
k,t: integer;
begin
getmem(a, (ku) * sizeof(t_p_mass));
for i:=1 to ku do
a^[i]:=false;
write('Введите количество элементов множества: ');
read(ka);
write('Введите элементы множества: ');
for i:= 1 to ka do
begin
read(t);
a^[t]:=true;
end;
end;
procedure create_empty_mass;
//Процедура создания пустого массива типа t_p_mass в памяти.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: A - пустой массив для хранения элементов множества.
begin
ka:= 0;
new(a);
getmem(a, ku*sizeof(t_p_mass));
end;
procedure universe;
//Процедура создания универсума.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: u - множество с элементами универсума.
var
i: integer;
begin
for i:=1 to ku do
u^[i]:=true;
end;
function equality;
//Функция вычисления равенства A и B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
// ka - мощность множества A;
// kb - мощность множества B;
//Выход: F=true, если A=B, иначе F=false.
var
f: boolean;
i: word;
begin
i:=1;
f:=true;
while (i<=ku) and (f=true) do
begin
f:=a^[i]=b^[i];
i:=i+1;
end;
equality:=f;
end;
function inclusion;
//Функция вычисления включения A в B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
//Выход: F=true, если A включено в B, иначе F=false.
var
f: boolean;
i: word;
begin
i:=1;
f:=true;
while (i<=ku) and (f=true) do
begin
f:=a^[i]<=b^[i];
i:=i+1;
end;
inclusion:=f;
end;
function str_inclusion;
//Функция вычисления строгого включения A в B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
//Выход: F=true, если A включено в B и не равно ему, иначе F=false.
var
f,f2: boolean;
i: word;
begin
i:=1;
f:=true;
while (i<=ku) and (f=true) do
begin
f:=a^[i]=b^[i];
i:=i+1;
end;
i:=1;
f2:=true;
while (i<=ku) and (f2=true) do
begin
f2:=a^[i]<=b^[i];
i:=i+1;
end;
str_inclusion:= ((not f) and f2);
end;
procedure association;
//Процедура вычисления объединения A и B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
// ku - число элементов универсума;
//Выход: C - массив, хранящий объединение множеств A и B;
// kc - число элементов конечного множества.
var
i: word;
begin
kc:=0;
for i:=1 to ku do
begin
c^[i]:=a^[i] or b^[i];
if c^[i]=true then kc:=kc+1;
end;
end;
procedure cross;
//Процедура вычисления пересечения A и B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
// ku - число элементов универсума;
//Выход: C - массив, хранящий пересечение множеств A и B;
// kc - число элементов конечного множества.
var
i: word;
begin
kc:=0;
for i:=1 to ku do
begin
c^[i]:=a^[i] and b^[i];
if c^[i]=true then kc:=kc+1;
end;
end;
procedure difference;
//Процедура вычисления разности A и B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
// ku - число элементов универсума;
//Выход: C - массив, хранящий разность множеств A и B;
// kc - число элементов конечного множества.
var
i: word;
begin
kc:=0;
for i:=1 to ku do
begin
c^[i]:=a^[i]>b^[i];
if c^[i]=true then kc:=kc+1;
end;
end;
procedure smc_difference;
//Процедура вычисления симметрической разности A и B.
//Вход: А - массив, хранящий элементы множества А;
// B - массив, хранящий элементы множества B;
// ku - число элементов универсума;
//Выход: C - массив, хранящий симметрическую разность множеств A и B;
// kc - число элементов конечного множества.
var
i: word;
begin
kc:=0;
for i:=1 to ku do
begin
c^[i]:=a^[i]<>b^[i];
if c^[i]=true then kc:=kc+1;
end;
end;
procedure addition;
//Процедура вычисления дополнения множества A.
//Вход: А - массив, хранящий элементы множества А;
// ku - число элементов универсума;
//Выход: C - массив, хранящий дополнение множества A;
// kc - число элементов конечного множества.
var
i: word;
begin
kc:=0;
for i:=1 to ku do
begin
c^[i]:=(not a^[i]);
if c^[i]=true then kc:=kc+1;
end;
end;
end.program test;
uses crt, sets_3;
var
i: word;
a: t_p_mass;
ka,ku: word;
begin
ku:=10;
clrscr;
create_mass(ku,ka,a);
for i:=1 to ku do
if a^[i]=true then
write(i, ' ');
end.Решение задачи: «Найти ошибку в модуле работы с множествами»
textual
Листинг программы
procedure create_mass(ku: word; var ka: word; VAR a: t_p_mass);