Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Динамическая память

Автор: Neon6868 31.05.2007 22:12

Задание: В основной программе зарезервировать память в куче для размещения 100 вещественных значений.В вектор Х записать указатели на каждое значение. Сформировать случайные вещественные числа и записать их в динамическую память. Считая, что все элементы вектора Х отличны от NIL, описать процедуру uniquex(x), которая в векторе Х все элементы, ссылающиеся на равные числа, заменяет на первый из этих элементов.

Вот программа, но я не могу сделать эту процедуру.Подскажите кто-нибудь как её делать?

Код

Program DP;
type
  preal=^real;
  vector=array[1..100] of preal;
var
  x:vector;
  i:integer;
procedure unique(x:vector);
var
  i:integer;
  mx:real;
  a:array[1..100] of integer
begin
end;


begin
  new(x);
  randomize;
  for i:=1 to 100 do begin
    new(x^[i]);
    x^[i]^:=random(100);
    write('   ',x^[i]^:5:2);
  end;

  dispose(x);
end.

Автор: volvo 31.05.2007 22:44

Вот так?

Program DP;
const
n = 100;
type
preal=^real;
pvector=^vector;
vector=array[1 .. n] of preal;
var
x:pvector;
i:integer;
procedure unique(x:pvector);
var
changed: array[1 .. n] of boolean;
i, j: integer;
begin
for i := 1 to n do changed[i] := false;

for i := 1 to n - 1 do
for j := i + 1 to n do
if (not changed[i]) and (not changed[j]) and
(x^[i]^ = x^[j]^) then
begin
changed[j] := true;
dispose(x^[j]);
x^[j] := x^[i];
end;

for i := 1 to n do
if changed[i] then write(i:3); { <-- Это просто показывает, ЧТО поменяли }
writeln;
end;


begin
new(x);
randomize;
for i:=1 to 100 do begin
new(x^[i]);
x^[i]^:=random(100);
write(' ',x^[i]^:5:2);
end;

unique(x);

writeln;
for i := 1 to n do begin
write(' ',x^[i]^:5:2);
end;
{ ?? Что будешь делать здесь ?? }
dispose(x);
end.

Только учти, что теперь у тебя будут проблемы при удалении массива... Перед Dispose надо бы освободить память, на которую указывает КАЖДЫЙ элемент массива X, однако у тебя несколько элементов указывают в одну область памяти... Первый из них - удалится нормально, на втором сразу получишь "неправильное действие с указателем"... Что будешь делать?

Автор: Neon6868 1.06.2007 20:44

Цитата(volvo @ 31.05.2007 19:44) *

Что будешь делать?


Я проверил программу и никаких проблем не было! smile.gif Поэтому ничего не стал исправлять. Спасибо тебе за помощь! good.gif

Автор: volvo 1.06.2007 20:54

Проблем не было, потому что я не стал делать:

for i := 1 to n do dispose(x^[i]); { <--- Вот это ...}
dispose(x);
Как только ты это добавишь, проблема сразу проявится...

А если не добавлять - то... Однако, у тебя сейчас утечка памяти в программе smile.gif Попробуй добавить пару memavail:

begin
writeln('Доступно памяти: ', memavail);
new(x);

{ здесь - все как и было раньше ... }

dispose(x);
writeln('Доступно памяти: ', memavail);
end.

и сравни 2 значения... Вот и memory leak...