Главная страница
    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.47 MB
Время: 0.012 c
6-74348
shark
2003-08-26 20:22
2003.10.23
онлайновая игра бес сервера


7-74513
Supra
2003-08-05 03:44
2003.10.23
Как просканирвать шину PCI?


1-74275
Стрелок
2003-10-13 09:10
2003.10.23
Помогите с вредной прогой!


1-74200
kaktus
2003-10-13 17:22
2003.10.23
перекодировка из Dos в Win


1-74176
inwin
2003-10-10 12:21
2003.10.23
Прокрутка колесом мышки





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