Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конкурс среди Delphi-программистов, Объявляется набор участников. 
:(
    Опции темы
Alexeis
  Дата 10.10.2008, 09:53 (ссылка) |    (голосов:19) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459




Конкурс среди Delphi-программистов


Мы объявляем о начале конкурса по программированию. Участие в конкурсе – отличный способ 
оценить уровень своих знаний. Каждый день мы пишем какой-то код, решая различные задачи. Но 
все эти задачи являются типовыми и со временем выполняются на «автомате». Повышение 
мастерства программиста, наоборот, происходит при решении оригинальных задач, при изучении 
нового материала, когда программист думает. Данный конкурс позволит всем желающим проверить 
уровень своих знаний и сообразительность.
Данный конкурс является первым у нас, и мы надеемся, что проведение подобных конкурсов в 
будущем станет хорошей традицией.

Правила участия в конкурсе по программированию

1.Регистрация участников
К участию в конкурсе допускаются все желающие, при соблюдении данных правил.
Для того, чтобы стать участником, нужно быть зарегистрированным участником форума Vingrad. 

До 15 октября 2008 года надо направить заявку на участие в конкурсе.  Для этого необходимо
 написать сообщение в данной теме с содержанием «Буду участвовать» или отправить ПМ представителям комиссии. Отправляем сюда 
Участие в конкурсе бесплатное.


2.Сроки проведения конкурса 
Конкурсное задание высылается всем участникам по внутренней почте форума (PM) и публикуется на
 форуме 16 октября в 12-00 (МСК).
С 16 по 19 октября 2008 года включительно будут приниматься решения внутреннюю почту (PM) участника Отправляем сюда 
C 20 по 23 октября будет проводиться рассмотрение предоставленных решений путем тайного 
голосования внутри комиссии по проведению конкурса.
К 24 октября будет объявлен победитель с его решением. И выставлены все решения, для того чтобы 
все убедились в справедливости решения.

3.Выбор победителя 
Победа в конкурсе подразумевает 100% правильное решение задачи (при всевозможных входных условиях задачи программа давала заданный условием результат).
При отсутствии решений в соответствии с вышесказанным условием конкурс может быть признан 
недействительным.
Критерии оценки правильности решения будут указаны в тексте задачи.
По результатам конкурса будет только один победитель. Если решений, которые претендуют на 
победу, больше – будет отобрано то, которые было прислано раньше.

4.Призы 
Победитель будет немедленно переведен в группу «Эксперт», а также получит 5 баллов репутации. 
Всем участникам предоставившим рабочее решение хотя бы одной задачи будет повышена репутация на один балл. Занявшим 2 и 3е место на 3 и 2 бала соответственно.

5.Заключительные положения 
Исходные тексты решения необходимо писать 100% на Delphi в любой версии, но используя 
синтаксис Delphi 7.
Информация о победителе и его решение будет опубликовано на форуме.
Выбор победителей проводится силами комиссии по проведению конкурса. Её состав : Rrader
AlexeisSnowyGirderDecember.
Победитель объявляется один раз, без возможности пересмотра.
Данный конкурс является некоммерческим. 
Комиссия по проведению конкурса обязуется неукоснительно соблюдать данные правила. В случае 
возникновения разногласий, которые на урегулированы данными правилами, – комиссия по 
проведению конкурса оставляет за собой право вносить односторонние изменения в правила с 
последующим уведомлением всех участников.

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

Зарегистрированные участники: 
morpheyushkakemiistoTHandleStaruhaCoderjsaBose
MakPocctHE_EGOiSTEmr.AndersonQu1ntMetalFanChristoph
aktubaSneG0KPoseidon,klimrmadWaReZMENILyAHA
ilBEastline0nVICTARigimonBaD_SeCt0RVanHelsing
ShaggyMadCoder,586MriboAversSanechichek,DCeres,
Frees,Telepyz,safon777,Rennigth,pseud,bems~FoX~
AndreyZ53,AntonN,Alix,Felan,RockClimber,Matematik,
Solitaire,Pichuser,Yanis,actualSajtran,Mauzer91MERLIN123.

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

Задания на конкурс

1) Задача на алогоритм
Дана матрица случайных чисел m x n (m и n) константы (например 10 на 10). Требуется отсортировать ее элементы по спирали. Т.е. для матрицы 3 х 3 получить примерно такой результат. 
123
894
765

Вывод по своему усмотрению. Можно и в консоль.

Критерии оценки задания: лучшим будет считаться такое решение, которое будет быстрее всех.
------------------------------------------------------------------------------------

2)Задача на потоки.
  Условие: Есть Хулиган с мусорными пакетиками и дворник. Задача хулигана разбросать все мусорные пакетики и при этом не попасться на глаза дворнику. Задача дворника убирать мусор и накостылять хулигану smile . 
  Поле состоит из 60 ячеек (одномерное). 
  Хулиган появляется в произвольной позиции на поле и выбрасывает за раз только 1 пакетик (занимает ячейку) в течении 60мс, после чего он исчезает чтобы через 300 мс появиться в новой позиции начать там гадить. У хулигана запас 22 пакетика.
  Дворник бегает от края до края поля за раз сметая 3 бумажки (очищая 3 соседние ячейки) в течении 400мс.
  Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

  Требование к решению. В программе должно быть 3 потока (Основной, дворник, хулиган) + простейшая отрисовка в виде ячеек.

  В атаче пример реализации (зеркало http://narod.ru/disk/3216906000/huligan_vs_Dvornik.zip.html) . 3 красных квадарата это дворник в процессе уборки. Ячейки рисуются по XOR во время уборки и заполняется белым после очистки, пакетик хулигана на время выброса становиться желтым, а после ухода становиться синим. Красным кружком помечается позиция где пойман хулиган.

  Примечание: графическая отрисовка может отличаться от предложенной, но тогда, дополнительно, потребуется ее описание. 

Критерии оценки задания: лучшим будет считаться такое решение, которое будет правильнее всех, т.е. грамотная синхронизация потоков, без лишних простоев и одновременных обращений к общей памяти. Также будет учитываться прозрачность кода и наглядность визуализации.
--------------------------------------------------------------------------------------

3) На знание внутренних механизмов Delphi.

В Delphi конструктор любого класса может работать в двух режимах:

1) Режим создания нового экземпляра объекта:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
end;


2) Но можно сделать и так:
Код

...
var
  Button: TButton;
begin
  Button := TButton.Create(Nil);
  Button.Create(Nil);
end;


Во втором случае просто произойдет реинициализация экземпляра класса.

Представьте, что перед Вами возникла задача создать экземпляр некоторого класса в "чужом" приложении. Что для этого нужно? Ну, во-первых, сам класс, который будет создан, во-вторых, режим работы (создание нового или реинициализация уже созданного экземпляра).
Если конструктор класса может принимать параметры, то они также понадобятся. Зная адрес конструктора, его можно вызвать. 

Отмечу один из важнейших моментов при работе с "чужими" приложениями - для начала все действия нужно проверять на своем приложении. Задание посвящено методике создания классов в "чужих" приложениях.

Итак, дан простой класс, имеющий конструктор с целочисленным параметром. Он просто выводит сообщение с переданным при создании числом.

Код

type
 TDummy = class(TObject)
  private
    FValue: Integer;
  public
    procedure ShowValue; virtual;
    constructor Create(Value: Integer); virtual;
  end;

implementation

{ TDummy }

constructor TDummy.Create(Value: Integer);
begin
  inherited Create;
  FValue := Value;
  ShowValue;
end;

procedure TDummy.ShowValue;
begin
  ShowMessage('Value is: ' + IntToStr(FValue));
end;


Требуется:

1) Написать обыкновенную функцию (не метод) CreateClass, которая бы создавала объект класса TDummy (т.е. написать аналог родного конструктора). Параметры функции - на Ваше усмотрение.

Иными словами: 

Dummy := TDummy.Create(); 

будет эквивалентен коду:

Dummy := CreateClass();

2) Написать простой пример использования функции, создав экземпляр класса (в локальной переменной), передав в конструктор произвольное значение.

Входные данные:
1) Можно пользоваться классом TDummy как типом данных.

Условия:
1) Не использовать ассемблер.
2) Не вызывать конструктор напрямую:

Код

...
var
  Dummy: TDummy;
begin
  Dummy := TDummy.Create(123); // Подобные вызовы в любом месте решения запрещены!
end;


3) Все остальное делать можно smile

Критерии оценки задания: лучшим будет считаться такое решение, которое будет идеально моделировать "родной" конструктор в любом режиме его работы.

Полезность задачи - позволяет динамически создавать классы и компоненты в "чужих" приложениях без использования модулей VCL в своих.

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


Победители конкурса. 

Всего можно было набрать 60 баллов, 10 за 1ю, 30 за 2ю, 20 за 3ю

bems      - 53
MetalFan    - 53
actual    - 45

Sajtran    - 41
aktuba    - 30
AntonN    - 27
Poseidon    - 24
jsa       - 23
THandle - 19


ne0n             - 10
Shaggy          - 9
Felan             - 9 
tHE_EGOiSTE - 4
Qu1nt             - 3
mr.Anderson   -2
Staruha          - 2

Очень хорошие решения представили Sajtran,  AntonNaktubajsa
Суперское решение первой задачи представили ne0nbems и Shaggy
Очень хорошо 3е задание решил bems.
2е задание лучше всех удалось MetalFan. Очень грамотно, аккуратно, эффективно и прозрачно.

Как и обещалось все кто прислал решения хотя бы одной задачи или попытку решения, получат по одному +

 Все задачи были просмотрены на предмет упущений, отступлений от задания, т.е. весьма подробно.

 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 19.10.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Цитата

 а про 3 так и не понял нафига такое, классы да инжектить в чужое приложение,бррр.... 

причем это как то относится к профессионализму работы в дельфи... понимаю, если бы то открыть метод, закрытый далеко в предках, а тут даже не ооп. вот потому и жду правильного решения, может я не так понял...

кстати, сегодня уже закроется принятие работ, можно выставить решения от администрации конкурса (ну на первые две ладно, там нет однозначного решения, а вот третье...)?


--------------------
user posted image
PM MAIL WWW   Вверх
tHE_EGOiSTE
Дата 20.10.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 19.10.2007
Где: Vyksa

Репутация: 1
Всего: 1



Цитата(AntonN @ 19.10.2008,  22:06)
Цитата

 а про 3 так и не понял нафига такое, классы да инжектить в чужое приложение,бррр.... 

 Это используется для того, чтобы мы могли создавать объекты, классы которых неизвестны на этапе компиляции.
\\
Реальная практическая задача, как и сказал Rrader - это например получить компоненты чужих программ из файла.
\\
Я вот часа 2 возился с этой задачай.... smile  Сделал таки..... smile 

Это сообщение отредактировал(а) tHE_EGOiSTE - 20.10.2008, 00:58
PM MAIL WWW ICQ Skype   Вверх
Staruha
Дата 20.10.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



Вообще то если честно я уже в пятницу сошла с дистанции - оценила свои силенки -время и ... smile 


--------------------
Возмездие настигнет
PM MAIL   Вверх
Alexeis
Дата 20.10.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Все, ФИНИШ
Вот список приславших решения:
tHE_EGOiSTEmr.AndersonaktubaStaruhaShaggyjsaFelanAntonNSajtranPoseidonbemsMetalFanactualne0nTHandleQu1nt.

Решения больше не принимаются. Проверьте, все ли решения я получил.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Poseidon
Дата 20.10.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Staruha @  20.10.2008,  08:48 Найти цитируемый пост)
Вообще то если честно я уже в пятницу сошла с дистанции 
Хехе. А решение-то прислала все-раво smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Alexeis
Дата 20.10.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Ну вот возмущений было куча, а беглый просмотр выявил 2 правильных 3х задания. Вторые задания почти все с огрехами, кроме одного. Уже наметились 2 явных победителя  smile .
  Все задания были решаемыми более того на 2ю задачу был поясняющий пример, однако, из 8 ми решенных 2х задач только 1 ведет себя правильно, возможно в реализации не все ситуации отлова, но выглядит правильно.

1) ситуация Хулиган перед тем как занять, проверят не занята ли ячейка, если занята, то он пойман, иначе занимает ячейку, рисует себя желтым, ждет 60мс в течении которых его может поймать дворник, после чего если он оказался не пойман, он оставляет бумажку (рисует ячейку синим), освобождает ячейку бежим дальше.

2) ситуация Дворник сначала пытается занять 3 ячейки, отрисовывается, если одна из них занята то хулиган пойман, иначе ждем 400 мс, в течении которых Хулиган может еще попасть на одну из 3х ячеек. Только после ожидания очищаем ячейки, отрисовываемся, отпускаем ячейки, и бежим дальше.

Только такое поведение будет считаться правильным. За любое отступление от алгоритма буду снимать балы.

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

Все события отлова удобно отправлять в виде сообщений. Так решили многие.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 20.10.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Alexeis
Цитата

ситуация Хулиган перед тем как занять, проверят не занята ли ячейка, если занята, то он пойман, иначе занимает ячейку

Означает ли это, что хулигану нельзя отрисовываться, когда ячейка занята дворником? если да - простестую, в задании таких подробностей нет. Даже логически поразмыслить - дворник (настоящий smile ) поймает хулигана в тот момент, когда он встанет возле него с мусором, а не когда он подумает прибежать из другого конца парка. Да и отрисовка может отличаться от предложенной...
Так же нет подробностей по алгоритму оставления пакетика - сразу по прибытии или перед переходом на слудующую ячейку.




--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 20.10.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(AntonN @  20.10.2008,  11:34 Найти цитируемый пост)
Означает ли это, что хулигану нельзя отрисовываться, когда ячейка занята дворником? если да - простестую, в задании таких подробностей нет.

  Касательно отрисовки это второстепенно, к таким мелочам придераться не будем, тем более что сразу после такого события поверх всего должен появиться кружек. По этому пункту согласен.

Цитата(AntonN @  20.10.2008,  11:34 Найти цитируемый пост)
Так же нет подробностей по алгоритму оставления пакетика - сразу по прибытии или перед переходом на слудующую ячейку.

  Если пакетик будет оставлен перед переходом, а не до паузы в 60 мс, то хулигана не возможно будет поймать, по моему это очевидно, ведь если он ничего не выбросил, то за что его ловить? Ловят с поличным, после того как выбросил.

Цитата(Alexeis @  16.10.2008,  09:59 Найти цитируемый пост)
Хулиган появляется в произвольной позиции на поле и выбрасывает за раз только 1 пакетик (занимает ячейку) в течении 60мс, после чего он исчезает


Выбрасывание пакетика эквивалентно занятию ячейки, но всякие флаги того что мусор уже выброшен или в процессе (у кого как), должны быть выставлены до периода в 60мс. Флаг "выбрасывает" или "выбросил" выставленный до 60 мс буду считать эквивалентными.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 20.10.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Alexeis, т.е. сел в клетку, тут же выкинул пакет, тут же получил по шее, если попал к дворнику? ну а если дворника нет - так и сидит в грязи 60мс smile

а вот про сообщения я даже не догадался, тут действительно можно было применить smile привык работать многопоточно без форм...


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 20.10.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(AntonN @  20.10.2008,  12:03 Найти цитируемый пост)
Alexeis, т.е. сел в клетку, тут же выкинул пакет, тут же получил по шее, если попал к дворнику? ну а если дворника нет - так и сидит в грязи 60мс smile

  60мс ну смотри, это ж очень мало, почти мгновенно, потом в течении 300 мс спокойно убегает. Т.е. в среднем он не так долго сидит  smile . В примере на 60мс клетка желтеет. Его можно поймать только пока он желтый smile .



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 20.10.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Alexeis @  20.10.2008,  12:55 Найти цитируемый пост)
тем более что сразу после такого события поверх всего должен появиться кружек.

в задании это не было обязательным условием...
было написано 
Цитата
Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

а уже в примере реализации было про кружок...
я посчитал это необязательным условием.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rrader
  Дата 20.10.2008, 14:34 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Правильное решение 3-го задания
В Delphi конструктор может работать в двух режимах - создавать объект и реинициализировать созданный объект. Режим определяется способом вызова конструктора - в первом случае он вызывается как метод класса, во втором случае - как метод созданного объекта.

Delphi различает эти режимы по скрытому параметру, неявно передающемуся в конструктор. Если рассмотреть конструктор как обычную процедуру, то его можно представить следующим образом:

Код

constructor TDummy.Create(Value: Integer); virtual;
// Эквивалентен:
function TDummyCreate(TypeInfo: Pointer; Alloc: Boolean; Value: Integer): TDummy;

По соглашению параметры будут переданы следующим образом:
TypeInfo - EAX - информация о создаваемом классе.
Alloc - EDX - флаг режима, выделять память или нет. Поскольку однобайтовый, то достаточно использовать для него регистр DL (так делает Delphi).
Value - ECX - первый параметр конструктора.

Адрес конструктора можно получить так:
Код

@TDummy.Create;

Назначив его любой переменной процедурного типа, его можно вызвать:
Код

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator(FTypeInfo, Alloc, Value);
end;

Но зная, что при вызове Creator параметры уже подготовлены, можно переписать код более компактно:
Код

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function: TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  Result := Creator;
end;

А вот и пример использования:
Код

...
var
  Dummy: TDummy;
begin
  { Создание }
  Dummy := CreateClass(TDummy, True, 10);
  { Реинициализация }
  CreateClass(Dummy, False, 10);
  Dummy.Free;
end;

Задание очень простое, и есть люди, его решившие smile  smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
THandle
Дата 20.10.2008, 14:39 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Rrader, вон оно как...

Блин. Ведь просто же... smile 

RraderAlexeis, огромное спасибо за интересные задания и за сам конкурс вообще smile 
PM   Вверх
Mayk
Дата 20.10.2008, 16:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



А теперь эталонное решение первой задачи на brainfuck'e для сетки 3х3(прямоугольные - скуучно)  рядом с которым код дельфи скучен и уныл  smile smile  


(код генерился [и даже оптимизировался] скриптом на питоне, поэтому без рабочего интерпретатора brainfuck'а с 16 ячейками вправо и переводом строк по 0x0D лучше не смотреть )


Цитата

13:46:dvl:~/src/t1$ echo 012345678 | bf t1.bf 
012
783
654

13:46:dvl:~/src/t1$ echo zbcdefigh | bf t1.bf 
bcd
ize
hgf

13:47:dvl:~/src/t1$ echo 987654321 | bf t1.bf 
123
894
765



13:47:dvl:~/src/t1$ echo 595555515 | bf t1.bf 
155
595
555


Добавлено через 40 секунд
сам код слшиком большой чтобы пихать в сообщение :-(

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  t1.bf 28,69 Kb


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
CodeMonkey
Дата 20.10.2008, 17:30 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(Rrader @  20.10.2008,  14:34 Найти цитируемый пост)
Но зная, что при вызове Creator параметры уже подготовлены

Аккуратнее надо.

Код
function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
(*
  FTypeInfo - eax
  Alloc - edx
  Value - ecx
*)
type
  TCreator = function(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  @Creator := @TDummy.Create;
  // Поскольку в CreateClass FTypeInfo не используется, то eax - свободен. Следовательно, адрес конструктора копируется в eax, затирая ссылку на класс
  Result := Creator;
  // Конструктор получает ссылку на самого себя вместо ссылки на класс с соответствующими последствиями
end;


Добавлено через 1 минуту и 27 секунд
P.S. 
Цитата(CodeMonkey @  20.10.2008,  17:30 Найти цитируемый пост)
адрес конструктора копируется в eax

Допускаю, что может зависеть от версии компилятора и режимов компилирования, но выбор свободного общедоступного регистра eax, а не какого-либо другого - логичен.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.