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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2009, 14:25   #1
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию Делфи. Как очистить содержимое массива?

Здравствуйте!!!
Есть массив. В него вносится информация из файла. Массив String. Как можно его очистить после того как программа к нему обратилась чтобы он не занимал память. И чтобы если программа вновь к нему обратиться количество строк в нем отсчитывалась вновь.

Язык программирования Delphi!!! Массив Mass[I,J]
Да прибудет с Вами свет и радость!!!

Последний раз редактировалось S_Yevgeniy; 12.08.2009 в 14:37.
S_Yevgeniy вне форума Ответить с цитированием
Старый 12.08.2009, 14:59   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Изначально освобождаем все строки (в цикле)
Код:
for i:=0 to max_po_i-1 do
begin
   for j:=0 to max_po_j-1 do
   begin

       Mass[i, j]:='';
   end;
end;
таким образом массив будет существовать, но все элементы не будут занимать память (официально, на самом деле String в большинстве случаев в Делфи являются длинными строками, а они в свою очередь представляются указателями).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 12.08.2009, 15:07   #3
S_Yevgeniy
Форумчанин
 
Аватар для S_Yevgeniy
 
Регистрация: 08.07.2009
Сообщений: 246
По умолчанию

Ну я так сделал!!! Это не помогает. Проблема в том что массив мне нужен для того чтобы в нем временно хранить данные из файлов. Вот например я открыл файл раскидал содержимое по узлам массива потом нужное передал в StringGrid. Далее открываю следующий файл. И он может оказаться меньше предыдущего а массив не очищен.


А может вы можете подсказать как пользоваться динамическим массивом. Просто что-то в литературе мудрено написано.
Как вот создать динамический массив типа . Mass array [0..500,0..10] of string;
Как мне подсказал Google динамический массив можно чистить.
Огромное Вам спасибо.
Да прибудет с Вами свет и радость!!!
S_Yevgeniy вне форума Ответить с цитированием
Старый 12.08.2009, 15:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

установи нулевую длинну массива
но аккуратнее...+ты уверен что оно тебе нужно?

и не забывай что Винда не сразу освобождает зарезервированную память(то есть в диспетчере память жратся будет всеравно)
массив локальный/глобальный?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.08.2009 в 15:11.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.08.2009, 15:35   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Установить длину динамического массива можно через SetLength(имя_массива, число_элементов), также можно установить длину отдельной строки (считайте что перед Вами, массив символов).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.08.2009 в 15:37.
Utkin вне форума Ответить с цитированием
Старый 12.08.2009, 15:44   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Подробный пример с использованием ZeroMemory:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var  mas :array[0..5, 0..5]of string;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var I, J :Integer;
begin
 Randomize;
 for I:=0 To 5 do
  for J:=0 To 5 do
   mas[i, j] := Format('Int[%d, %d]=%d', [I, J, Random(100)+20]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ListBox1.Clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
var I, J :Integer;
    S :string;
begin
 for I:=0 To 5 do
 begin
   S := '';
  for J:=0 To 5 do
   S := S + ' ' +mas[i, j];
   ListBox1.Items.Add(S);
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ZeroMemory(@mas, SizeOf(mas));
end;

end.
Alter вне форума Ответить с цитированием
Старый 12.08.2009, 15:47   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну у него разные данные, он не знает какой размер массива ему нужно, седня столько, через 2 минуты в два раза больше...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 12.08.2009, 16:16   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
он не знает какой размер массива ему нужно,
Как-то же он определяет размер первого массива, так же и всех остальных. Просто сначала определить количество элементов следующего массива N, потом Setlength(mas,N);
puporev вне форума Ответить с цитированием
Старый 12.08.2009, 16:20   #9
ivladak
 
Регистрация: 28.03.2009
Сообщений: 8
По умолчанию

Цитата:
А может вы можете подсказать как пользоваться динамическим массивом. Просто что-то в литературе мудрено написано.
Как вот создать динамический массив типа . Mass array [0..500,0..10] of string;
Как мне подсказал Google динамический массив можно чистить.
Огромное Вам спасибо.
объявляется в твоем случае динамический массив так:
var
mass: array of array of string;

т. е. ты теперь имеешь динамический массив динамических массивов.

как работать с длиной, выше уже было написано. чистить - просто уменьшать длину.. например, setlength(mass[i],0) или даже setlength(mass,0,0), если хочешь убить сразу все.

еще не забывать, что динамические массивы всегда рассматриваются в 0-индексации. было еще сказано, что память освобождается не сразу. это действительно так, но дело даже не в операционной системе, а в языке и среде разработки. было эксперементально установлено, что C++ после уменьшения длины динамических массивов (векторов) отдает память, а Delphi - нет
ivladak вне форума Ответить с цитированием
Старый 12.08.2009, 16:34   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а не проще ли TStringList.LoadFromFile() ?
(чем TStringList не массив? )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как очистить массив? chandrasecar Общие вопросы Delphi 9 09.11.2008 20:39
Как очистить экран? dimorik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 01.10.2008 18:29
Как очистить Canvas? beegl Общие вопросы Delphi 4 30.05.2008 02:51
Как очистить Canvas? Pro_BerSerK Общие вопросы Delphi 9 30.01.2008 16:03
как очистить экран doncova1 Общие вопросы C/C++ 3 18.03.2007 09:50