Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизПро передачу массивов в ф-цию и т.д. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c