Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

глюк или не глюк   Найти похожие ветки 

 
Parus ©   (2006-04-10 19:17) [0]

Вот такой глюк или не глюк у меня получился:
если вы кнопкой вызовите этот код:

procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
if t.Caption=t.Caption then t.caption:="#";

end;

то у кнопки изменится надпись.
_________
Но если код оптимизировать, вот так:

procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
t.caption:="#";
end;

то меняется заголовок формы
_________________
ПОЧЕМУ у МЕНЯ такое происходит?
(Borland Delphi 2005 Arhitect Edition )
_________________
зато первый код если вызывать всеми кнопками (одну процедуру) то код меняет надпись у "кликнутой" кнопки.


 
Суслик ©   (2006-04-10 19:18) [1]

жуть :)
t где значение задаешь?


 
Суслик ©   (2006-04-10 19:20) [2]


> зато первый код если вызывать всеми кнопками (одну процедуру)
> то код меняет надпись у "кликнутой" кнопки.

тебе оччень повезло что именно так.


 
Parus ©   (2006-04-10 19:21) [3]


> t где значение задаешь?

Ни где!
____________________
Объясни пожалуста ПОЧЕму это происходит!


 
Мефисто   (2006-04-10 19:30) [4]

BD7
Тоже самое :)


 
Virgo_Style ©   (2006-04-10 19:32) [5]

В Пентагоне думают: почему взорвался правый ускоритель?
В Кремле думают: почему не взорвался левый ускоритель?

Тут надо думать, почему оно вообще как-то работает, а не почему именно так...


 
Суслик ©   (2006-04-10 19:59) [6]


> Объясни пожалуста ПОЧЕму это происходит!

не хочу, т.к. ты не прочел ни одной страницы ни одной книги по дельфи.


 
Мефисто   (2006-04-10 20:26) [7]

Суслик ©   (10.04.06 19:59) [6]

Но факт остается фактом. Почему оно РАБОТАЕТ???


 
Desdechado ©   (2006-04-10 20:57) [8]

совпадение
AV - более вероятно


 
Grom PE ©   (2006-04-10 21:09) [9]

Забавный эдакий хак. Работает и в Delphi 7.
А проще вот как:
procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
 t.Caption;
 t.Caption:="#";
end;


 
Gero ©   (2006-04-10 21:40) [10]

> Ни где!

И как ты думаешь, на что указывает t?


 
Rouse_ ©   (2006-04-10 21:54) [11]

Это просто видна работа оптимизатора.
убираются явные ошибки при написании кода...

procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
t.caption:="#";
end;


Переменная Т не используется - все что связано с ней изымается, остается:

procedure TForm1.Button1Click(Sender: TObject);
begin
 caption:="#";
end;


 
Мефисто   (2006-04-10 22:00) [12]

>> убираются явные ошибки при написании кода...

Хм... Какой умный. А почему не предупреждает :(


 
jack128 ©   (2006-04-10 22:11) [13]

Мефисто   (10.04.06 22:00) [12]
Хм... Какой умный. А почему не предупреждает :(

Он предупреждает, просто ты читать не умеешь.


 
Sergey Masloff   (2006-04-10 22:22) [14]

jack128 ©   (10.04.06 22:11) [13]
Наверняка хинты и варнинги отключены. 100 против одного что так ;-)


 
EvS ©   (2006-04-10 22:28) [15]

procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
t.caption:="#";
end;

[Warning] Unit1.pas(29): Variable "t" might not have been initialized


 
Kerk ©   (2006-04-10 22:30) [16]

Rouse_ ©   (10.04.06 21:54) [11]

За такую "оптимизацию" руки отрывать надо.


 
Marser ©   (2006-04-10 22:32) [17]

> [16] Kerk ©   (10.04.06 22:30)
> Rouse_ ©   (10.04.06 21:54) [11]
>
> За такую "оптимизацию" руки отрывать надо.

Это ещё почему? Там ведь инициализации нет - явная заявка на AV.


 
Kerk ©   (2006-04-10 22:34) [18]

Marser ©   (10.04.06 22:32) [17]
Это ещё почему? Там ведь инициализации нет - явная заявка на AV.


Кто ж против AV? После того чего оптимизатор делает, такую ошибку в большом проекте хрен найдешь.


 
Kerk ©   (2006-04-10 22:38) [19]

Уверен, что дело не в оптимизаторе. Просто совпадение. Надо CPU смотреть чего там в стеке.


 
Marser ©   (2006-04-10 22:39) [20]

> [18] Kerk ©   (10.04.06 22:34)
> Marser ©   (10.04.06 22:32) [17]
> Это ещё почему? Там ведь инициализации нет - явная заявка
> на AV.
>
> Кто ж против AV? После того чего оптимизатор делает, такую
> ошибку в большом проекте хрен найдешь.

Что ж, остается только посетовать, что он не настраиваемый, по крайней мере, в старых версиях.


 
Gydvin ©   (2006-04-10 22:42) [21]

прикольно ))


 
Мефисто   (2006-04-10 22:46) [22]

Sergey Masloff   (10.04.06 22:22) [14]
Неа включены :)

jack128 ©   (10.04.06 22:11) [13]
Блин точно, как-то умудрился проглядеть :( Совсем слепой...


 
Grom PE ©   (2006-04-10 23:08) [23]

Rouse_ ©   (10.04.06 21:54) [11]
А как же быть с моим вариантом [9]?
Тоже t. отбрасывает? А почему тогда # у кнопки становится?


 
Gero ©   (2006-04-10 23:20) [24]

> [11] Rouse_ ©   (10.04.06 21:54)

Ты бы хоть смайлики ставил, а то народ и впрямь поверил.


 
Суслик ©   (2006-04-11 11:40) [25]


> Ты бы хоть смайлики ставил, а то народ и впрямь поверил.

он пока не мастер, ему можно так шутить :)


 
Parus ©   (2006-04-11 19:19) [26]


> не хочу, т.к. ты не прочел ни одной страницы ни одной книги
> по дельфи.

Почему???Прочитал...
но про что-то подобное не было ни в одной книге.
А так прочитал немного но ОЧЕНЬ много в этих книгах написанно, что мне и нравиться.
Вот книги(в порядке как они у меня "появлялись"):Delphi 6 учебный курс(я в ней очень часто что-то ищу и НАХОЖУ), Программирование в Delphi глазами хакера,
Delphi в шутку и в серьёз.


 
Хозяин   (2006-04-11 19:23) [27]

[0]
а как ты на такое нарвался вообще?


 
Суслик ©   (2006-04-11 21:35) [28]


> Parus ©   (11.04.06 19:19) [26]


> Программирование в Delphi глазами хакера

сейчас тебя за эту книгу съедят :)

-----------------

Вообще как-то слабо верится, что читал :) Пойми, это даже не ошибки, а основы, даже не основы, а.. даже не знаю, что. Ну типа, как говорить не уметь.


 
Gero ©   (2006-04-12 00:50) [29]

> Вообще как-то слабо верится, что читал :) Пойми, это даже
> не ошибки, а основы, даже не основы, а.. даже не знаю, что.
> Ну типа, как говорить не уметь.

Да ладно, в «глазах хакера» там байты по 9 бит, поэтому все может быть.


 
NightLord ©   (2006-04-12 02:24) [30]

глюк, это делфя неправильно со стеком работает -)
вот пример
procedure TForm1.Button1Click(Sender: TObject);
var
 j:integer;
 T:TButton;
 i:integer;
begin
 j:=0;
 i:=j;
 T.Caption;
 T.Caption:="#";
 i:=j+1;
 if j=0 then Exit;
end;


 
vlad_gri   (2006-04-12 14:16) [31]

Для варианта
procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
t.caption:="#";
end;

все понятно.

Развернем процедуру в asm, получиться

TForm1_Button1Click: ; Self:TForm1<EAX> Sender: TObject<EDX>
MOV EDX,"#"
CALL TControl.SetText


для оптимизации в качестве переменной t используется регистр EAX
"#" помещается в регистр EDX так как  Self:TForm1 и Sender: TObject в процедуре не используются а так как t неинициализированна то содержимое
регистра EAX не изменяется т.е. в нем остается Self:TForm1.
Таким образом это все выливается в вызов
TControl.SetText(Self:TForm1<EAX>,"#"<EDX>)

Второй вариант несколько сложней.


 
Игорь Шевченко ©   (2006-04-12 14:22) [32]


> Delphi глазами хакера


Выпученными или красными ?



Страницы: 1 вся ветка

Текущий архив: 2006.05.07;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.028 c
4-1140205287
Eraser
2006-02-17 22:41
2006.05.07
ISecurityInformation и Aclui.pas


15-1144734860
DelphiN!
2006-04-11 09:54
2006.05.07
Книга по Visual Studio 2005


9-1129114845
Yegorchic
2005-10-12 15:00
2006.05.07
ODE, FreeForm и другие mesh объекты


2-1145590311
Holod
2006-04-21 07:31
2006.05.07
хм...


2-1145280366
nyron
2006-04-17 17:26
2006.05.07
печатная форма