Текущий архив: 2004.05.16;
Скачать: CL | DM;
Внизкласс и динамический массив Найти похожие ветки
← →
evvcom © (2004-04-28 10:43) [40]
> Подскажите, пожалуйста, как передать, чтобы могла?..
см. [37]
← →
Alexus12 © (2004-04-28 10:48) [41]то есть достаточно поставить модификатор VAR
перед переменной/ссылкой на входной массив в объявлении?
А что значит, если ничего не ставить
или если ставить const?
догадываюсь, это будет передача не по сыылке, а по значени,?
блин, ну почему в help - proc declaration нет описания ключей???!!!!
← →
evvcom © (2004-04-28 10:56) [42]
> блин, ну почему в help - proc declaration нет описания ключей???!!!!
Каких ключей?
> то есть достаточно поставить модификатор VAR
> перед переменной/ссылкой на входной массив в объявлении?
Да.
> А что значит, если ничего не ставить
> или если ставить const?
Если ничего не ставить, то в функцию передается значение переменной или указатель, если размер переменной больше 4 байт, но тогда делается копия в стеке, и работа идет уже с копией в стеке. Если употребить const, то копия в стеке не создается, но на все попытки присвоить константе что-либо компилятор начинает ругаться.
← →
Alexus12 © (2004-04-28 11:29) [43]В итоге получаем
1. вызывающая процедура:
Type
TIntegerArray = array of Integer;
procedure FindMatch;
var
shablon:TStr;
ArrIndexes:TIntegerArray;
begin
shablon:=form1.Edit1.text;
//вариант 1
ArrIndexes:=MyClassInstance.Find(shablon);
//вариант 2
ResultCount:=MyClassInstance.Find(shablon, ArrIndexes);
end;
2. Метод-обработчик
//вариант 1
Function MyClass.Find(shablon):TIntegerArray;
var
I: Integer;
begin
Result := nil;
for I := 0 to High(fMas) do
begin
if fMas[I] удовлетворил условию, тогда добавим его ИНДЕКС в Result:
Setlength(Result, Length(REsult)+1);
Result[High(Result)] := I;
end;
end;
----------------
//вариант 2
ResultCount:=MyClassInstance.Find(shablon, ArrIndexes):Integer;
var
I: Integer;
begin
Result := nil;
for I := 0 to High(fMas) do
begin
if fMas[I] удовлетворил условию, тогда добавим его ИНДЕКС в ArrIndexes:
Setlength(ArrIndexes, Length(ArrIndexes)+1);
ArrIndexes[High(ArrIndexes)] := I;
Result:=Result+1;
end;
--------
Какой вариант обычно избирают (считают корректным/быстрым/удобным) и почему?
Спасибо!
← →
evvcom © (2004-04-28 11:35) [44]В стандартном unit Types уже есть декларация:
type
TIntegerDynArray = array of Integer;
← →
Jack128 © (2004-04-28 11:37) [45]
> evvcom © (28.04.04 01:03) [27]
Да,я не удачный пример привел
TSameRec = packed record
b1, b2, b3: byte;
end;// SizeOf(TSameRec) = 3
TArr = array of TSameRec;
var
arr: TArr;
// Сейчас (Integer(@arr[1]) - Integer(@arr[0]))= SizeOf(TSameRec) но в будущем это возможно будет не так (каждый элемент массива будет вырывниваться по двойному слову и Integer(@arr[1]) - Integer(@arr[0]) = 4)
← →
Alexus12 © (2004-04-28 11:46) [46]>Если ничего не ставить, то в функцию передается значение переменной или указатель
значит, для передачи по ссылке нужен явный var...
а const ускоряет работу не используя копию в стеке...
как странно...
← →
evvcom © (2004-04-28 12:04) [47]Что странно?
var и const почти одинаково передают параметр, но при var компилятор разрешает изменять переменную, а при const нет.
← →
Alexus12 © (2004-04-28 14:01) [48]Странно = что по умолчанию (без var/const) передается значение,
а не ссылка
← →
evvcom © (2004-04-28 14:15) [49]
> Странно = что по умолчанию (без var/const) передается значение,
> а не ссылка
Если данные укладываются в 4 байта, то передается значение. Это справедливо и для const. А если > 4 байт, то передается ссылка, но для const и var ничего не копируется, а без них делается копия данных по ссылке в стеке.
← →
Alexus12 © (2004-04-28 17:22) [50]Спасибо за разъяснения про var/const!
А по (28.04.04 11:29) [43] ни у кого никаких комментариев?..
Страницы: 1 2 вся ветка
Текущий архив: 2004.05.16;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.036 c