![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массив и параметры по умолчанию [D5]
KSergey © (2005-01-10 12:55:00)Такая трабла:
Вызываемая функция
procedure SpChStart (const AElem: array of TWinControl; isEndProcessInfo: Boolean = TRUE);
var
L: Integer;
begin
L := Length (AElem));
.....
Если вызвать ф-цию без параметра по умолчанию, например так:
SpChStart ([Memo1]);
то длина массива AElem (для примера записываю в L) определяется какой-то совершенно бешенной!!
Если же второй параметр авно указать
SpChStart ([Memo1], TRUE);
то все нормально... Это так и должно быть или отнести на счет глюков дельфи?
KSergey (2005-01-11 07:22:00) [1]ПО мотивам обсуждения здесь навеяло мысли, проверил. Да, действительно:
а) виноват открытый массив
б) overload
Собственно вторую (перегруженную) реализацию делаить не обязательно. Лишь было приписано overload. Без него все работает корректно.
На "Королевстве" действительно это описано, давно "дата публикации 08-07-2002". :(
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=608
Kerk (2005-01-10 20:05:00) [2]Мда.. Делфи ведет себя здесь весьма странно.
jack128 прав. Видимо Делфи забывает обнулить ecx передmov cl,1.
еще любопытная вещь:
cmp byte ptr [ebp+$08],00
смотрел-смотрел на код.. как в это место стека попадают данные не понял :)
jack128 (2005-01-10 16:08:00) [3]KSergey © (10.01.05 15:59) [15]
А откуда же тогда узнать про
как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
?
Так это ж относится к методу с открытым массивом..
KSergey (2005-01-10 15:59:00) [4]> [14] jack128 © (10.01.05 15:54)
> не то выкладываешь ;-) Метод с дин массивом - нафиг, он
> не на что не влияет.
А откуда же тогда узнать про
как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
?
Впрочем, я тупо выложил все.
Да, я сравнивал, но тяму не хватило понять в чем фигня...
jack128 (2005-01-10 15:54:00) [5]не то выкладываешь ;-) Метод с дин массивом - нафиг, он не на что не влияет. Главное - оставь директиву overload и параметр по умолчанию. Теперь сравни код, генерируемый в этом SpChStart1([Memo1], True);, и в этом SpChStart1([Memo1]); случае. В теории - он должен быть одинаковым, а на практике компилятор просто забывает передать булеан параметр и почему то передает верхную границу открытого массива как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
KSergey (2005-01-10 15:05:00) [6]Вот тут выложил асмовские исходники. Кому не лень - гляньте...
http://www.do.ru/java/Asm/D5Err.html
jack128 (2005-01-10 14:22:00) [7]KSergey © (10.01.05 14:06) [8]
Поищи в подводных камнях на королевстве, вроде что то подобное упоминалось..у меня на D5 UP1 такой же глюк..Либо отказывайся от перегрузки, либо от параметров по умолчанию..
Kerk (2005-01-10 14:19:00) [8]KSergey © (10.01.05 14:17) [10]
давай в любом виде, лишь бы читабельно было.. и еще код того места, где вызов процедуры происходит.
KSergey (2005-01-10 14:17:00) [9]> [9] Kerk © (10.01.05 14:13)
Если очень интересно - могу привести. Возможно - в виде картинок...
Все едино ничерта не понял где собака порылась...
Kerk (2005-01-10 14:13:00) [10]д5 нету.. а хотелось бы асм код процедуры посмотреть
KSergey (2005-01-10 14:06:00) [11]Значит в дельфях5 косячек таки....
TUser (2005-01-10 13:59:00) [12]В D7 Ent WinXp [6] выдает все правильно
array
1
Да
KSergey (2005-01-10 13:51:00) [13]Ага, рассказываю...
Да, поспешил, не до конца прочувствовал ситуацию...
Штука вот в чем: зохотелось мне странного, объвить такую штуку:
type
TArrayWinControl = array of TWinControl;
TForm1 = class(TForm)
.....
private
procedure SpChStart1 (const AElem: array of TWinControl; isEndProcessInfo: Boolean = TRUE); overload;
procedure SpChStart1 (const AElem: TArrayWinControl; isEndProcessInfo: Boolean = TRUE); overload;
Зачем надо: либо прямо при вызове массив формирую, либо - динамический массив ну и т.д. Надо отметить, что дельфи не ругается на "слишком похожесть". Т.е. перегрузка проходит нормально, более того, судя по тексту, выдаваемую в диалоге, вызывается именно тот вариант, который и должен - с открытым массивом.
procedure TForm1.SpChStart1(const AElem: array of TWinControl;
isEndProcessInfo: Boolean);
var
S: String;
begin
S := 'array'#13 + IntToStr (Length (AElem));
if isEndProcessInfo then S := S + #13'Да'
else S := S + #13'Нет';
ShowMessage (s);
end;
procedure TForm1.SpChStart1(const AElem: TArrayWinControl;
isEndProcessInfo: Boolean);
var
S: String;
begin
S := 'TArrayWinControl'#13 + IntToStr (Length (AElem));
if isEndProcessInfo then S := S + #13'Да'
else S := S + #13'Нет';
ShowMessage (s);
end;
Ну и вызов:
procedure TForm1.Button2Click(Sender: TObject);
begin
SpChStart1([Memo1]);
end;
Дает:
array
4323586
Да
Если второй параметр указать явно - все нормально...
Кто виноват - не знаю.
TUser (2005-01-10 13:07:00) [14]В D7 все нормально
procedure A(E: array of TWinControl; B: boolean = true);
begin
if b then
ShowMessage(inttostr(length(E)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
A([Memo1]{, true});
end;
Gero (2005-01-10 13:02:00) [15]Создай новый проект, и там проверь.
KSergey (2005-01-10 13:00:00) [16]> [1] msguns © (10.01.05 12:58)
> Может, ты все же приведешь полный текст процедуры ?
Зачем?? Уже не верно олпределяется значение...
Впрочем, сейчас попробую полный примерчик накидать... Може я и правда вру?
Gero (2005-01-10 13:00:00) [17]Скорее всего, это ты что-то не так делаешь.
И почему после Length у тебя две закрывающих скобки?
msguns (2005-01-10 12:58:00) [18]Может, ты все же приведешь полный текст процедуры ?