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