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

Вниз

Про передачу массивов в ф-цию и т.д.   Найти похожие ветки 

 
KSergey ©   (2003-10-10 09:39) [0]

Вопросик то вроде простенький...

Задача:

TForm1 = class..
...
FArr: array of TWinControl;
...
end;

...

procedere StartForm (AArr: array of TWinControl);
begin
with TForm1.Create(..) do
begin
...
FArr := AArr; // !!
...
end;
end;


Где-то вызов StartForm хочется оформить так:

StartForm ([Memo1, Memo2, Edit1]);

Ну понятно, что сей код не откомпилируется (строка !!).

Хорошо, делаем так:

type

TArrWinCtrl = array of TWinControl;

TForm1 = class..
...
FArr: TArrWinCtrl;
...
end;

...

procedere StartForm (AArr: TArrWinCtrl);
begin
with TForm1.Create(..) do
begin
...
FArr := AArr;
...
end;
end;


Тут все вроде здорово, однако на вызов

StartForm ([Memo1, Memo2, Edit1]);

пишет: "Error: Ordinal type required"

Вопрос: как бы это так все обойти? Т.е. и вызов оставить в таком виде, и значение переприсвоить другой переменной?


 
Семен Сорокин ©   (2003-10-10 09:48) [1]

var
val: TArrWinCtrl;
...
SetLength(val, 3);
val[0] := Memo1;
val[1] := Memo2;
val[2] := Edit1;
StartForm(val);


 
KSergey ©   (2003-10-10 10:01) [2]

> [1] Семен Сорокин © (10.10.03 09:48)

Ну это-то понятно ;)

А, к стати, может кто скажет: что есть за переменная, например, описанная как

var
a: array of lala;

Это просто указатель или это какая-то структура? Я в том смысле, что, если, например описать 2 переменные как

var
a,b: array of lala;

то для конструкции

b := a;

не будет ли аналогом

MoveMemCopy (a, b, SizeOf(Pointer));

?


 
Verg ©   (2003-10-10 10:07) [3]


> procedere StartForm (AArr: array of TWinControl);
> begin
> with TForm1.Create(..) do
> begin
> ...
> FArr := AArr; // !!
> ...
> end;
> end;


SetLength(FArr, length(AArr));
mov(AArr[0], FArr[0], length(FArr)*sizeof(FArr[0]));

AArr - open array
FArr - dynamic array


 
Виктор Щербаков ©   (2003-10-10 10:07) [4]

If X and Y are variables of the same dynamic-array type, X := Y points X to the same array as Y.

И всё. Борланд больше ничего не обещает.


 
KSergey ©   (2003-10-10 10:13) [5]

> [3] Verg © (10.10.03 10:07)

ну в принципе да, выход. Двойное расходование памяти - но тут, думаю, будет не критично.

Всем спасибо!


 
MBo ©   (2003-10-10 10:14) [6]

>Борланд больше ничего не обещает.
Обещает еще увеличение счетчика ссылок


 
KSergey ©   (2003-10-10 10:28) [7]

> [6] MBo © (10.10.03 10:14)
> >Борланд больше ничего не обещает.
> Обещает еще увеличение счетчика ссылок

Ух ты, а ведь и верно.. Вот же гады... ;)
Короче, копированиями указателей тут баловаться опасно..
Хотя, думаю, этот массив всяко живет во время работы функции - а после он мне и не нужен.

Спасибо.


 
Verg ©   (2003-10-10 10:29) [8]


> то для конструкции
>
> b := a;
>
> не будет ли аналогом


Нет, не будет, т.к. еще должен увеличится счетчик ссылок на массив "a": теперь двое ссылаются на один и тот же массив

> var
> a: array of lala;
>
> Это просто указатель или это какая-то структура?


Это динамические массивы.

Механизм реализации - указатель на структуру+алгоритмы учета ссылок.
Прям как Вирт писал: "Алгоритмы+структуры данных=программы"...


 
Виктор Щербаков ©   (2003-10-10 10:31) [9]

KSergey © (10.10.03 10:28) [7]

> Хотя, думаю, этот массив всяко живет во время работы функции
> - а после он мне и не нужен.

Во время выхода из области видимости кол-во ссылок уменьшается на 1.
Если станет = 0, то память освобождается.



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
1-74158
From_X
2003-10-10 10:32
2003.10.23
Web Browser onClick, события компонентов


3-74082
AndrewK
2003-09-26 17:17
2003.10.23
Как заставить SQL server выполнить часть хранимой процедуры?


6-74341
DW
2003-08-27 07:58
2003.10.23
Включение(выключение) шары...


4-74536
RSN
2003-08-17 22:18
2003.10.23
Программное закрытие окна


6-74357
Веньтель
2003-08-25 22:54
2003.10.23
Программно запретить доступ к сетке некоторых машин