Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Вниз

Работа с памятью   Найти похожие ветки 

 
Переяслов Григорий   (2003-06-19 19:46) [0]

У меня есть модуль Unit1, в котором есть массив A в разделе implementation (принципиально), описанный так
type
TArray = Array of Double;
и функция:
function F1 : Pointer;

implementation
var
A : TArray;

Также есть модуль Unit2, в котором описан массив Mas:

Mas : Array of TArray;

Массив Mas нужно заполнить данными с помощью F1. Я полагаю, что это можно сделать так:

function F1 : Pointer;
begin
SetLength(A, 20);
A[0] := 10;
...
Result := @A;
end;

...

Unit Unit2;

begin
SetLength(Mas, 10);
Mas[0] := F1; // Каждый раз ссылаемся на новый участок памяти
Mas[1] := F1;
...

end;

Можно ли так сделать? Если нельзя, то как нужно поступить в данной ситуации? Sorry за сумбур.


 
Separator   (2003-06-19 20:06) [1]

Немного не понял вопрос - Что нужно сделать?


 
Переяслов Григорий   (2003-06-19 20:11) [2]

Вопрос в том, правильно ли я выделяю память для массива Mas в примере? Я это делаю через единую переменную A, описанную в Unit1.


 
panov   (2003-06-19 20:39) [3]

Неправильно.
Опиши задачу, тогда можно будет подумать что к чему...


 
Palladin   (2003-06-19 21:00) [4]

SetLength работает с одним и тем же указателем
если тебе нужно инициализировать двумерный дин массив то


unit Unit1;
interface
type
TAOI=array of integer;

procedure NewArray(var a:TAOI);
implementation

procedure NewArray(var a:TAOI);
begin
setlength(a,10);
end;
end.

unit unit2;
interface
...
implementation
uses unit1;
...
var
mas:array of arra of integer;
begin
SetLength(mas,10);
for i:=0 to high(mas) do NewArray(mas[i]);
end;
...

end;


но только к чему такая конструкция?
если можно сразу

SetLength(mas,10);
for i:=0 to high(mas) do SetLength(mas[i],10);


 
Переяслов Григорий   (2003-06-20 09:11) [5]

Уточняю проблему.
Необходимо создать в памяти несколько реализаций массива A, используя одну переменную типа TArray (принципиально), и затем обращаться к ним через переменные типа Pointer. Освбождать их нужно, тоже используя pointer. Можно ли делать так, как описано в примере или там что-то не так?

type
TArray = array of integer;
var
A : TArray;
P1, P2 : Pointer;

begin
SetLength(A, 10);
P1 := @A[0];
...
SetLength(A, 20);
P2 := @A[0];
A := nil; // исходная переменная уже не нужна
...
V1 := TArray(P1^)[2];
V2 := TArray(P2^)[12];
...
SetLength(TArray(P1^), 0);
SetLength(TArray(P2^), 0);
end;


 
Palladin   (2003-06-20 09:15) [6]

что ты тут написал... это даже в голове с трудом интерпретируется...

а сразу не судьба?

type
TArray = array of integer;
var
P1, P2 : Pointer;

begin
SetLength(TArray(P1), 10);
SetLength(TArray(P2), 20);
end;



 
Переяслов Григорий   (2003-06-20 10:18) [7]

Спасибо, разобрался :-)



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

Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
3-7303
first_aid
2003-06-06 10:01
2003.07.03
Не обновляется атоинкрементальное поле


1-7400
antoniz
2003-06-21 14:33
2003.07.03
Как обратиться к интерфейсу Excel


1-7512
Sabor
2003-06-21 17:39
2003.07.03
Exe-файл


3-7339
Solod
2003-06-10 09:19
2003.07.03
Перевод с BDE в ADO


3-7367
grifon_nn
2003-06-09 17:43
2003.07.03
Резервная копия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский