Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2010, 01:45   #1
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию Освобождение память (Паскаль)

Доброй ночи!
Подскажите пожалуйста, как у динамических массивов освобождать корректно память?
Суть в том, что если массив квадратный,то проблем нет. А если он прямоугольный, то цикл удаления строк выводит EInvalidPointer.
VadEr вне форума Ответить с цитированием
Старый 27.03.2010, 08:30   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Приводи код, а так можно сказать только: у тебя ошибка в н-ой строчке.
p51x вне форума Ответить с цитированием
Старый 27.03.2010, 10:09   #3
СВ9
 
Регистрация: 25.03.2010
Сообщений: 9
По умолчанию

Никаких проблем:
type
TBuf= array[1..10,1..20] of real;
var
Buf: ^TBuf
R: real;
begin new(Buf);
Buf^[1,1]:=1.0;
R:=Buf^[1,1];
dispose(Buf);
end.

А, вообще, динамический массив лучше строится на основе
связного списка, когда под каждую новую запись(строку)
выделяется своя память с запоминанием адреса
в предыдущей записи. Таким образом память используется
с максимальной экономией.
email: logsvi@yandex.ru
СВ9 вне форума Ответить с цитированием
Старый 27.03.2010, 10:22   #4
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Цитата:
Сообщение от VadEr Посмотреть сообщение
Доброй ночи!
Подскажите пожалуйста, как у динамических массивов освобождать корректно память?
Суть в том, что если массив квадратный,то проблем нет. А если он прямоугольный, то цикл удаления строк выводит EInvalidPointer.
А какой Паскаль поддерживает динамические массивы???
В Дельфях это делается так:
var
mass:array of 'type';
begin
SetLength(mass,length); //выделяем память для массива
...........

mass:=nil;//освобождаем память

end
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 27.03.2010, 19:42   #5
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

Код:
Type
  MyType = Integer;
Type
  PMas = ^TMas;
  TMas = Array[1..1] of MyType;
  PArray = ^TArray;
  TArray = Array[1..1] of PMas;
Var
  A: PArray;
  i,j, N,M: Integer;
begin
...
  GetMem(A, N*SizeOf(PMas));
  For i := 1 To M Do
    GetMem(A^[i], M*SizeOf(MyType));
...
  For i := 1 To M Do
    FreeMem(A^[i], SizeOf(MyType)*M);
  FreeMem(A, SizeOf(PMas)*N);
end;
если N=4,M=7, то EInvalidPointer на сторке FreeMem(A^[i], SizeOf(MyType)*M);
если N=7,M=4, то просто вылет из проги, когда заносим в массив данные
For i := 1 to N do
For j := 1 to M do
A^[i]^[j] := Random(100);

Цитата:
mass:=nil;//освобождаем память
насколько мне известно , то это только обнулит ссылку, а выделенная память так и останется зарезервированной
VadEr вне форума Ответить с цитированием
Старый 27.03.2010, 20:50   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
А какой Паскаль поддерживает динамические массивы???
да вы че ребята? паскаль поддерживает динамические массивы! только работа с таким массивом идет через указатели!
Код:
unit module1;

interface

type
  TMass = array[0..1] of Integer;  { массив, будет у нас динамическим}
  PMass = ^TMass; {указатель на массив}
  {создание массива по указаателю и с заданным размером}
  procedure CreateMassiv(var p: PMass; R: Integer);
   { заполнение массива по указателю случайными числами от N1 до N2}
  procedure FixMassiv(var p: PMass; N1: Integer; N2: Integer); 

implementation
var
  N: Integer;

procedure CreateMassiv(var p: PMass; R: Integer);
begin
  GetMem(p, SizeOf(Integer) * R); {выделяем память под динамический массив}
  N := R;
end;

procedure FixMassiv(var p: PMass; N1: Integer; N2: Integer);
var
  i: Integer;
begin
  Randomize;
  for i := 0 to N - 1 do begin
    p^[i] := N1 + Random(N2 - N1);
  end;
end;

end.
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 28.03.2010, 11:31   #7
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

VadEr писал:
Цитата:
Цитата:
mass:=nil;//освобождаем память
насколько мне известно , то это только обнулит ссылку, а выделенная память так и останется зарезервированной
Да будет Вам известно, милейший, что динамический массив - это тип данных с управляемым временем жизни, поэтому можно не заботиться о своевременном освобождении памяти, выделенной под этот массив. Память будет освобождаться автоматически, когда переменная покинет область видимости.
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 28.03.2010, 11:41   #8
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

RUSt88 писал:
Цитата:
да вы че ребята? паскаль поддерживает динамические массивы! только работа с таким массивом идет через указатели!
Паскаль не поддерживает динамический массив как встроенный тип данных
(попробуй сделать трансляцию программы, где будет следующая строка
Код:
Var
  Mass:array of 'тип'; {именно так определяется дин. массив}
Другое дело, что используя ссылки, можно просто сконструировать динамическую структуру данных, организовав ее в массив...
А это уже из другой оперы песня...

Причем приведенный тобой пример смело можно назвать псевдо-динамическим массивом, так как размер памяти, выделяемый под такой массив не может превышать 64 кБ, да и то, если эта память ничем не занята. Вот так то...
Перемешивай дело с бездельем и не сойдешь с ума...

Последний раз редактировалось Grag; 28.03.2010 в 14:55.
Grag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36