При использовании разряженной матрицы вместо обычных пере-
менных можно применять динамическое выделение памяти под матрицу.
Пусть, например, имеется два процесса А и В, выполняющиеся в од-
ной программе. Предположим, что процесс А требует при работе 60%
доступной памяти, а при работе процесса В требуется 55% памяти.
Если в процессе А и в процессе В память будет выделяться с по-
мощью локальных переменных, то процесс А не сможет обратиться к
процессу В, а процесс В не сможет обратиться к процессу А, пос-
кольку потребуется более 100% памяти. Если процесс А не обращает-
ся к процессу В, то никаких трудностей не будет. Трудности поя-
вятся при попытке процесса А обратиться к процессу В. Выход из
этого положения заключается в динамическом выделении памяти и для
процесса А и для процесса В с освобождением памяти перед обраще-
нием одного процесса к другому процессу. Другими словами, если
при выполнении каждого процесса, А и В, требуется более половины
имеющейся доступной памяти и процесс А обращается к процессу В,
то должно использоваться динамическое распределение памяти. В
этом случае процессы А и В будут получать в свое распоряжение па-
мять, когда она им действительно потребуется.
Предположим, что при выполнении некоторой программы, исполь-
зующей две указанные ниже функции, остается 100 000 байт неис-
пользованной памяти.
procedure B; forward;
procedure A;
var
a:array[1..600000] of char;
.
.
.
begin
.
.
.
B;
.
.
.
end;
procedure B;
var
b:array[1..55000] of char;
begin
.
.
.
end;
Здесь каждый из процессов А и В имеет локальные переменные,
на которые расходуется более половины имеющейся доступной памяти.
В данном случае нельзя будет выполнить процесс В, поскольку памя-
ти недостаточно для выделения 55 000 байт под локальный массив
"в".
В подобных случаях трудности часто оказываются непреодолимы-
ми, но в некоторых случаях кое-что сделать можно. Если процесс А
не требует сохранения содержимого массива "а" при выполнении про-
цесса В, то процессы А и В могут совместно использовать один
участок памяти. Это можно обеспечить динамическим выделением па-
мяти под массивы А и В. Процесс А перед обращением к процессу В
должен освободить память и затем вновь ее получить после заверше-
ния процесса В. Программа должна иметь следующую структуру:
procedure B; forward;
procedure A;
var
a:^array[1..600000] of char;
begin
New(a);
.
.
.
Dispose(a); { освобождение памяти для процесса В }
B;
New(a); { новое выделение памяти }
.
.
.
Dispose;
end;
procedure B;
var
b:^array[1..55000] of char;
begin
New(b);
.
.
.
Dispose(b);
end;
При выполнении процесса В существует только указатель "а".
Хотя этим методом вы будете пользоваться нечасто, его следует хо-
рошо знать, поскольку он часто является единственным способом ре-
шения подобных проблем.