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

Вниз

Хм, задачка...   Найти похожие ветки 

 
Rouse_ ©   (2011-10-14 23:31) [0]

Сия задача была озвучена в Августе 2004-го года в парке, находящимся рядом с кинотеатром Пушкинский, на скамейке, где сидели два, похмеляющихся после тяжкой работы, тела - Зотыч и Розыч :)

... и навеяло данной веткой: http://delphimaster.net/view/2-1318507172/

Задача выглядит просто, есть два варианта кода:

procedure TForm1.Button1Click(Sender: TObject);
var
 DC: HDC;
 S: String;
begin
 DC := Canvas.Handle;
 S := Memo1.Lines[0];
 TextOut(DC, 10, 10, PChar(S), Length(S));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 DC: HDC;
 S: String;
begin
 S := Memo1.Lines[0];
 DC := Canvas.Handle;
 TextOut(DC, 10, 10, PChar(S), Length(S));
end;


Нужно определить, какой из них отработает не верно и почему.


 
Бездомный   (2011-10-14 23:36) [1]

DC := Canvas.Handle;
S := Memo1.Lines[0];

DC теперь недейстивтельный.


 
Rouse_ ©   (2011-10-14 23:46) [2]


> Бездомный   (14.10.11 23:36) [1]
> DC теперь недейстивтельный.

Ответ не полный, вопрос был: "Нужно определить, какой из них отработает не верно и почему."


 
Jeer ©   (2011-10-14 23:47) [3]

Другими словами - "слепок" с канвы действителен только до момента обращения к другим элементам на "канве".
Ибо он и был предназначен изначально лишь для целей вывода канвы на печать или в "изображение".


 
Rouse_ ©   (2011-10-14 23:51) [4]


> Jeer ©   (14.10.11 23:47) [3]
>
> Другими словами - "слепок" с канвы действителен только до
> момента обращения к другим элементам на "канве".

Ответ не верный, наглядно это демонстрирует следующий код, где оба обработчика работают нормально:

procedure TForm1.Button1Click(Sender: TObject);
var
 DC: HDC;
 S: String;
begin
 DC := Canvas.Handle;
 S := Button1.Caption;
 TextOut(DC, 10, 10, PChar(S), Length(S));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 DC: HDC;
 S: String;
begin
 S := Button2.Caption;
 DC := Canvas.Handle;
 TextOut(DC, 10, 10, PChar(S), Length(S));
end


 
Jeer ©   (2011-10-14 23:52) [5]

Оба отработают верно, но каждый - в своем контексте.
Если о "наблюдении вывода" - то второй.


 
Rouse_ ©   (2011-10-14 23:54) [6]


> Jeer ©   (14.10.11 23:52) [5]
>
> Оба отработают верно, но каждый - в своем контексте.
> Если о "наблюдении вывода" - то второй.

Переведи...


 
Jeer ©   (2011-10-14 23:55) [7]


> Ответ не верный,


"Верность" - понятие относительное.
Батоны - надстройка.
Мемо - принадлежность канве.


 
Jeer ©   (2011-10-14 23:57) [8]

Берем пэйнтбокс - это вообще часть канвы изначально, всего лишь crop ее части.


 
Rouse_ ©   (2011-10-14 23:58) [9]


> Jeer ©   (14.10.11 23:55) [7]
>
>
> > Ответ не верный,
>
>
> "Верность" - понятие относительное.
> Батоны - надстройка.
> Мемо - принадлежность канве.

Сурово...
Ок, допустим, мемо каким боком к канве относится, особливо инстересно узнать с точки что туда баттон не подходит?


 
Rouse_ ©   (2011-10-14 23:59) [10]


> Jeer ©   (14.10.11 23:57) [8]
>
> Берем пэйнтбокс - это вообще часть канвы изначально, всего
> лишь crop ее части.

Не ну это все понятно, а ответ то на вопрос будет?


 
Jeer ©   (2011-10-15 00:02) [11]

:)
Ну как - кнопка же выше канвы :)
Отрисовка своими силами.

P.S.
Да ладно, не бери в разум - я тут изгаляюсь после свадьбы дочки :)


 
Rouse_ ©   (2011-10-15 00:06) [12]

да я примерно так и понял - кстати еще раз поздравляю :)

ЗЫ: но ответ так и не дан пока что ни кем.


 
Jeer ©   (2011-10-15 00:10) [13]


> ЗЫ: но ответ так и не дан пока что ни кем.


Ну так, использование мемо в данном примере принципиально же ?
Или подобных "вырезок" в канве ?


 
Rouse_ ©   (2011-10-15 00:11) [14]


> Jeer ©   (15.10.11 00:10) [13]
> Ну так, использование мемо в данном примере принципиально
> же ?
> Или подобных "вырезок" в канве ?

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


 
Германн ©   (2011-10-15 00:22) [15]


> Нужно определить, какой из них отработает не верно и почему.

Хм. Интересно будет в конце-концов узнать при чём тут современный ассемблер для Intel & AMD? Или не современный, а тот что Дельфийский компилятор использовал в 2004-м, когда вышеназванные опохмелялись "в парке, находящимся рядом с кинотеатром Пушкинский" :)


 
Eraser ©   (2011-10-15 00:31) [16]

Удалено модератором


 
Rouse_ ©   (2011-10-15 00:38) [17]


> Хм. Интересно будет в конце-концов узнать при чём тут современный
> ассемблер для Intel & AMD?


Ну если ты хочешь увидеть задачу по асму, то их есть у меня.
Данный код выводит строчку "Test" на консоль от одного до нескольких раз.
Задача - выяснить сколько раз и почему, без компиляции.
Впрочем "сколько" я думаю и так понятно - полюбому скомпилите, тогда вопрос - как?

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

procedure tst;
begin
 writeln("Test");
end;

begin
 asm
   call tst
   lea eax, tst
   lea ecx, @1
   push ecx
   push eax
   push eax
   call eax
   ret
 @1:
 end;
 Readln;
end.


 
Eraser ©   (2011-10-15 00:38) [18]

Удалено модератором
Примечание: Бинго...


 
Rouse_ ©   (2011-10-15 00:56) [19]


> Eraser ©   (15.10.11 00:38) [18]

Абсолютно верный детект ошибки - мои респекты...


 
Rouse_ ©   (2011-10-15 01:16) [20]


> Eraser ©   (15.10.11 00:38) [18]

Вторую задачку с 17-го поста одолеешь?


 
Бездомный   (2011-10-15 01:17) [21]

Что за произвол?=))


 
Rouse_ ©   (2011-10-15 01:21) [22]


> Бездомный   (15.10.11 01:17) [21]
>
> Что за произвол?=))
>

В плане?


 
Kerk ©   (2011-10-15 01:23) [23]

Три раза по-моему. Мог сбиться, поздно уже.
Суть в том, что ret на выходе из функции берет адрес возврата из стэка. Дальше сами считайте :)


 
Rouse_ ©   (2011-10-15 01:27) [24]


>  Kerk ©   (15.10.11 01:23) [23]

Почти верно и стэк правильно озвучил...


 
Kerk ©   (2011-10-15 01:30) [25]

А, ну я call tst вначале прозевал :)
Про стэк - я ж в молодости вирусняками увлекался, там это азбука :)


 
Rouse_ ©   (2011-10-15 01:33) [26]


> Kerk ©   (15.10.11 01:30) [25]
> А, ну я call tst вначале прозевал :)

Промахнулся :)
Там нюанс в изымании рет-калбэка вызываемой функцией, т.е. хинттрик на двойном RET-RET применяемом при переполнении стэка...


 
Rouse_ ©   (2011-10-15 01:36) [27]

блин, хреновый из меня партизан :)


 
Kerk ©   (2011-10-15 01:41) [28]

А разве этот ret вообще выполнится? Там же последний прыжок пойдет на ECX, который указывает на @1 после этого ret.


 
Rouse_ ©   (2011-10-15 01:47) [29]


> Kerk ©   (15.10.11 01:41) [28]
>
> А разве этот ret вообще выполнится?

:)


 
Kerk ©   (2011-10-15 01:49) [30]

А, прости, туплю. Ведь этот ret и запускает всю цепочку.
Пойду спать, чтоб еще глупостей не нагородить :)


 
Rouse_ ©   (2011-10-15 01:59) [31]

Скажем инициирует, а не запускает - но вывод верный :)


 
Бездомный   (2011-10-15 03:06) [32]

 
  call tst   // 1 раз
  lea eax, tst
  lea ecx, @1
  push ecx
  push eax  // "стек1"
  push eax // "стек2"
  call eax  // второй раз
  ret  // тут заход на третий раз, а ret из tst сделает заход на 4 раз, т.к. будет думать что адрес возврата то, что в "стек1". ret из tst 4ого раза вернется на @1
@1:

правильно?


 
Германн ©   (2011-10-15 03:07) [33]


> Ну если ты хочешь увидеть задачу по асму, то их есть у меня.

У меня тоже их есть. Только АСМ другой.
Вот думаю как 8-ми байтное число представить однозначно 13-ти значным десятичным числом. И понимаю что никак. :(

А куды  тогда бедному крестьянину, пардон разработчику, податься? Если ему задали разработать преобразователь "микролан" -> штрихкод.


 
Бездомный   (2011-10-15 03:08) [34]

"стек1" и "стек2" надо местами поменять =)


 
Kerk ©   (2011-10-15 03:13) [35]


> Бездомный   (15.10.11 03:06) [32]

У меня так и получается, но Розыч говорит, что не 4


 
Rouse_ ©   (2011-10-15 03:17) [36]


> Бездомный   (15.10.11 03:08) [34]
>
> "стек1" и "стек2" надо местами поменять =)

Правильно :)


> Германн ©   (15.10.11 03:07) [33]
> Вот думаю как 8-ми байтное число представить однозначно
> 13-ти значным десятичным числом.

Ну это действительно тяжко, бо восмибайтовое число представляется максимум в виде десятизначного без запятой, если о целочисленном типе речь ведется...


 
Rouse_ ©   (2011-10-15 03:19) [37]


> Kerk ©   (15.10.11 03:13) [35]
> У меня так и получается, но Розыч говорит, что не 4

я сказал что ты чутка ошибся, а не о количестве :)


 
Германн ©   (2011-10-15 03:19) [38]


> Германн ©   (15.10.11 03:07) [33]
>
>

И это нужно реализовать на самых "крошечных" процессорах :(
Ибо места для"больших" микросхем просто нет!


 
Германн ©   (2011-10-15 03:27) [39]


> Rouse_ ©   (15.10.11 03:17) [36]

> > Германн ©   (15.10.11 03:07) [33]
> > Вот думаю как 8-ми байтное число представить однозначно
> > 13-ти значным десятичным числом.
>
> Ну это действительно тяжко, бо восмибайтовое число представляется
> максимум в виде десятизначного без запятой, если о целочисленном
> типе речь ведется...
>

Саш, а если посчитать?
Ну или ты меня не понял.


 
Rouse_ ©   (2011-10-15 03:30) [40]

Ну можно и посчитать: восемь байт FFFFFFFF вмещают в себя десять знаков  4294967295.



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

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

Наверх




Память: 0.57 MB
Время: 0.009 c
15-1319033042
Arrant
2011-10-19 18:04
2012.02.05
как создать собственную "очередь сообщений" для DDE сервера?


15-1318347500
sniknik
2011-10-11 19:38
2012.02.05
Хочу поменять работу...


3-1271355569
istok
2010-04-15 22:19
2012.02.05
D2010 и кодировка в Firebird...


4-1253690134
Tooreagen
2009-09-23 11:15
2012.02.05
Передать текст с помощью сообщений в другую программу (Delphi)


3-1271490232
namco
2010-04-17 11:43
2012.02.05
delphi+mysql без ODBC