Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
14-74447
Orion2
2003-10-03 16:52
2003.10.23
Люди сами не знают чего хотят


7-74508
Nosik_alex
2003-08-06 10:17
2003.10.23
как создать виртуальный принтер


14-74435
Knight
2003-10-04 22:07
2003.10.23
Кто встречал...


1-74221
WED
2003-10-09 12:37
2003.10.23
Ошибка: Не был произведен вызов CoInitialize


1-74149
AlexanderSK
2003-10-10 15:01
2003.10.23
Varian - массив в массиве





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский