Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
8-1222096864
РФМ
2008-09-22 19:21
2012.02.05
Наличие картинки DBImage


2-1319921661
samsung
2011-10-30 00:54
2012.02.05
Поиск в Memo


15-1319020883
Kerk
2011-10-19 14:41
2012.02.05
WinXP: User Permissions


15-1318710605
Юрий
2011-10-16 00:30
2012.02.05
С днем рождения ! 16 октября 2011 воскресенье


15-1318541682
icelex
2011-10-14 01:34
2012.02.05
у-пи-эс





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