Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1105394964
Kick
2005-01-11 01:09
2005.01.23
У фрейма нет события OnCreate, как же мне инициализировать переме


4-1101736313
Dema-X
2004-11-29 16:51
2005.01.23
как по handle определить, какому приложению принадлежит окно


9-1097422358
Evgenius
2004-10-10 19:32
2005.01.23
Проблема с кривыми...


14-1104578232
speed
2005-01-01 14:17
2005.01.23
Новый год!


14-1104495124
Rock2015
2004-12-31 15:12
2005.01.23
Javascript





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