IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Динамическая память, Помогите доделать программу.
Neon6868
сообщение 31.05.2007 18:12
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Задание: В основной программе зарезервировать память в куче для размещения 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.05.2007 18:44
Сообщение #2


Гость






Вот так?

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 16:44
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


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

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


Я проверил программу и никаких проблем не было! smile.gif Поэтому ничего не стал исправлять. Спасибо тебе за помощь! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.06.2007 16:54
Сообщение #4


Гость






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

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...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 29.03.2024 15:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"