Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизМассив и параметры по умолчанию Найти похожие ветки
← →
KSergey © (2005-01-10 12:55) [0]Такая трабла:
Вызываемая функцияprocedure SpChStart (const AElem: array of TWinControl; isEndProcessInfo: Boolean = TRUE);
var
L: Integer;
begin
L := Length (AElem));
.....
Если вызвать ф-цию без параметра по умолчанию, например так:SpChStart ([Memo1]);
то длина массива AElem (для примера записываю в L) определяется какой-то совершенно бешенной!!
Если же второй параметр авно указатьSpChStart ([Memo1], TRUE);
то все нормально... Это так и должно быть или отнести на счет глюков дельфи?
← →
msguns © (2005-01-10 12:58) [1]Может, ты все же приведешь полный текст процедуры ?
← →
Gero © (2005-01-10 13:00) [2]Скорее всего, это ты что-то не так делаешь.
И почему после Length у тебя две закрывающих скобки?
← →
KSergey © (2005-01-10 13:00) [3]> [1] msguns © (10.01.05 12:58)
> Может, ты все же приведешь полный текст процедуры ?
Зачем?? Уже не верно олпределяется значение...
Впрочем, сейчас попробую полный примерчик накидать... Може я и правда вру?
← →
Gero © (2005-01-10 13:02) [4]Создай новый проект, и там проверь.
← →
TUser © (2005-01-10 13:07) [5]В 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;
← →
KSergey © (2005-01-10 13:51) [6]Ага, рассказываю...
Да, поспешил, не до конца прочувствовал ситуацию...
Штука вот в чем: зохотелось мне странного, объвить такую штуку:
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:59) [7]В D7 Ent WinXp [6] выдает все правильно
array
1
Да
← →
KSergey © (2005-01-10 14:06) [8]Значит в дельфях5 косячек таки....
← →
Kerk © (2005-01-10 14:13) [9]д5 нету.. а хотелось бы асм код процедуры посмотреть
← →
KSergey © (2005-01-10 14:17) [10]> [9] Kerk © (10.01.05 14:13)
Если очень интересно - могу привести. Возможно - в виде картинок...
Все едино ничерта не понял где собака порылась...
← →
Kerk © (2005-01-10 14:19) [11]KSergey © (10.01.05 14:17) [10]
давай в любом виде, лишь бы читабельно было.. и еще код того места, где вызов процедуры происходит.
← →
jack128 © (2005-01-10 14:22) [12]KSergey © (10.01.05 14:06) [8]
Поищи в подводных камнях на королевстве, вроде что то подобное упоминалось..у меня на D5 UP1 такой же глюк..Либо отказывайся от перегрузки, либо от параметров по умолчанию..
← →
KSergey © (2005-01-10 15:05) [13]Вот тут выложил асмовские исходники. Кому не лень - гляньте...
http://www.do.ru/java/Asm/D5Err.html
← →
jack128 © (2005-01-10 15:54) [14]не то выкладываешь ;-) Метод с дин массивом - нафиг, он не на что не влияет. Главное - оставь директиву overload и параметр по умолчанию. Теперь сравни код, генерируемый в этом SpChStart1([Memo1], True);, и в этом SpChStart1([Memo1]); случае. В теории - он должен быть одинаковым, а на практике компилятор просто забывает передать булеан параметр и почему то передает верхную границу открытого массива как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
← →
KSergey © (2005-01-10 15:59) [15]> [14] jack128 © (10.01.05 15:54)
> не то выкладываешь ;-) Метод с дин массивом - нафиг, он
> не на что не влияет.
А откуда же тогда узнать про
как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
?
Впрочем, я тупо выложил все.
Да, я сравнивал, но тяму не хватило понять в чем фигня...
← →
jack128 © (2005-01-10 16:08) [16]KSergey © (10.01.05 15:59) [15]
А откуда же тогда узнать про
как byte(1) (mov cl, $01), хотя в далее в коде оперирует с ней как с Integer числом (то есть использует сразу весь регистр ECX, а не только младший его байт)
?
Так это ж относится к методу с открытым массивом..
← →
Kerk © (2005-01-10 20:05) [17]Мда.. Делфи ведет себя здесь весьма странно.
jack128 прав. Видимо Делфи забывает обнулить ecx передmov cl,1
.
еще любопытная вещь:cmp byte ptr [ebp+$08],00
смотрел-смотрел на код.. как в это место стека попадают данные не понял :)
← →
KSergey © (2005-01-11 07:22) [18]ПО мотивам обсуждения здесь навеяло мысли, проверил. Да, действительно:
а) виноват открытый массив
б) overload
Собственно вторую (перегруженную) реализацию делаить не обязательно. Лишь было приписано overload. Без него все работает корректно.
На "Королевстве" действительно это описано, давно "дата публикации 08-07-2002". :(
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=608
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c