Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оператор SomeDynamicArray:=nil делает не то, что хотелось бы =) [D7, WinXP]


Pasha L ©   (2008-07-01 17:12:00) 

Здравствуйте.
У меня есть массив Pointer'ов "A". Я хочу посоздавать массивов и записать их адреса в "A". Затем уже в другой подпрограмме продолжить работу с созданными массивами, восстановив их по сохраненным адресам.
Делаю так (показано схематично):
for i:=1 to 5 do begin
 setLength(tmp,10);
 A[i]:=tmp;
 tmp:=nil;
end;


tmp:=nil я делаю из тех соображений, чтобы при вызове setLength(tmp,10); создался новый массив (то, что мне и нужно). Но при tmp:=nil, как я понимаю, память, занимаемая массивом tmp, освобождается, а мне нужно, чтобы эта память оставалась занятой, а значение tmp просто занулялось.

Наглядный пример:


{$APPTYPE CONSOLE}
var
 p:Pointer;
 a,b:array of integer;
begin
 setLength(a,5);
 p:=a;
 //a:=nil;
 //вот если включить предыдущую строчку, то будет ошибка.
 b:=p;
 writeln(length(b));
 readln;
end.



Что делать в таком случае?)


Правильный-Вася   (2008-07-02 15:46:00) [1]

непонятно так же фраза

> посоздавать массивов и записать их адреса в "A". Затем уже
> в другой подпрограмме продолжить работу с созданными массивами,
>  восстановив их по сохраненным адресам.

какие могут быть адреса в другой программе, если у каждой программы свои адреса


Юрий Зотов   (2008-07-01 21:30:00) [2]

> Pasha L   (01.07.08 18:47) [6]

> A[i] типа Pointer

А на хрена? Почему не сделать по-человечески?

type
 TDynamicArray = array of ...;
var
 A: array[1..5] of TDynamicArray;
...
for i := 1 to 5 do
 SetLength(A[i], 10);

Или еще проще - двумерный динамический массив. Кстати, из ветки непонятно, почему он не может быть обычным двумерным статическим массивом.


Pasha L   (2008-07-01 18:47:00) [3]

Поросенок Винни-Пух ©   (01.07.08 18:28) [4]
чё то я вас не понял.

Anatoly Podgoretsky ©   (01.07.08 18:42) [5]
)))да уж, всё просто... немного дополнил и самое оно:
setLength(T_array_of_SomeType(A[i]),10);
а то A[i] типа Pointer, поэтому Incompatible types. А так всё оке.
благодарю


Anatoly Podgoretsky   (2008-07-01 18:42:00) [4]

> Pasha L  (01.07.2008 17:12:00)  [0]

setLength(A[i],10);


Поросенок Винни-Пух   (2008-07-01 18:28:00) [5]

p:=a;
//a:=nil;


p:=a;
//a:=nil;
p := nil;

сам массив никуда не денется


Pasha L   (2008-07-01 17:50:00) [6]

=) ну вот я TList и использую. Если бы я использовал не TList, то не мучался и сделал бы array of array of SomeType.


Поросенок Винни-Пух   (2008-07-01 17:40:00) [7]

У меня есть массив Pointer'ов "A".

TList вместо массива


Pasha L   (2008-07-01 17:16:00) [8]

То есть я, конечно же, могу создать класс, где будет поле типа массив. И сохранять адреса не на массивы, а на объекты этого класса. Но хотелось бы чего нибудь попроще)


Наверх

Титульная страница Поиск, карта сайта Написать письмо