Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.03;
Скачать: CL | DM;

Вниз

Оператор SomeDynamicArray:=nil делает не то, что хотелось бы =)   Найти похожие ветки 

 
Pasha L   (2008-07-01 17:12) [0]

Здравствуйте.
У меня есть массив 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.



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


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

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


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

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

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


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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2008-07-01 18:42) [5]

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

setLength(A[i],10);


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

Поросенок Винни-Пух ©   (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. А так всё оке.
благодарю


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

> 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);

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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.08.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
15-1213786698
Nucer
2008-06-18 14:58
2008.08.03
Лог вызовов API функций


2-1215364824
lewka
2008-07-06 21:20
2008.08.03
ColorDialog


3-1203485088
bagryan
2008-02-20 08:24
2008.08.03
коннект со второго раза


3-1203609071
jziiiiiii
2008-02-21 18:51
2008.08.03
Объясните


15-1213376317
parovoZZ
2008-06-13 20:58
2008.08.03
Прозрачность DirectX / OpenGL окна)