Модераторы: 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   Вверх
Poseidon
Дата 21.10.2008, 08:39 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(aktuba @  20.10.2008,  20:49 Найти цитируемый пост)
А то ведь всю голову сломал, пытаясь в ручную выделить память, заполнить ее и вызвать конструктор.
Вот. Видели бы вы тот код...  smile 

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

(мне вот интересно, а если бы горе-программист, который писал TDummy, взял и отошел от соглашений и назвал конструктор не Create, а как-нибудь иначе. Вы бы также использовали в своем "правильном решении" @TDummy.Create? Нет? А как? Сослались бы на другое имя? Т.е. обратились бы к конструктору по другому имени? Если учесть, что в задании "использовать конструктор на прямую нельзя", то вам должно быть все-равно как называется конструктор у исходного класса. Именно так я понял задание, именно так я его пытался сделать).



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


Опытный
**


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

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



Poseidon
Цитата

мне вот интересно, а если бы горе-программист, который писал TDummy, взял и отошел от соглашений и назвал конструктор не Create, а как-нибудь иначе. Вы бы также использовали в своем "правильном решении" @TDummy.Create? Нет? А как? Сослались бы на другое имя? Т.е. обратились бы к конструктору по другому имени?

меня другое интересует, а что было бы если бы там был не Д7 (в чужой программе), а другая версия, при этом нужно узнавать версию, и написано ли приложение вообще на дельфи smile


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


Смышленный
***


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

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



Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Мы не такие звери, все решения будут приняты  

Сейчас то какая разница? Суть не в этом, а в том, что задание было на запрет вызова конструктора (как я понял, да и многие другие), а в результате все-равно вызывался конструктор. На примере формы, можно так:
Код

Form1 := TForm.Create;

а можн так:
Код

CreateForm(...);

Причем это стандартный вызов конструктора, хотя и не используется обычный вызов. Такое решение подошло бы? Или это считалось бы не верным решением?

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Делов было на 5-минут.

=))) Подмести пол тоже не долго, но к Delphi отношения не имеет ;)

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
Теперь каждый участник знает, как можно создать класс из asm-вставки

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

Цитата(Rrader @  21.10.2008,  05:19 Найти цитируемый пост)
задание с учетом "нужности" навыка

Об этом и сказал выше. Такая "нужность" мало кому нужна. Очень мало. Потоки или графика или, даже, сеть, нужна куда чаще.



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


Inspired =)
***


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

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



Есть два типа людей - одни постоянно спрашивают, куда катится этот мир? А другие катят его.

Цитата(Poseidon @  21.10.2008,  15:39 Найти цитируемый пост)
Если учесть, что в задании "использовать конструктор на прямую нельзя"

В задании было запрещено только вызывать конструктор с параметром. И приведен пример, как делать нельзя. В самом задании была дана подсказка: "Зная адрес конструктора, его можно вызвать".

Сколько еще будем перепираться? smile 

AntonN, еще раз повторюсь, от версии Delphi это не зависит. Или Вам кодом ткнуть?

Добавлено через 5 минут и 8 секунд
Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Причем это стандартный вызов конструктора, хотя и не используется обычный вызов. Такое решение подошло бы? Или это считалось бы не верным решением?

Внимательно читаем задание.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
а в результате все-равно вызывался конструктор.

Да, но не напрямую - это значит без круглых скобочек.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Лучше бы каждый участник научился правильно использовать наследование, чем учить ассемблерные вставки. Я, например, ничему из этого задания не научился, т.к. мне не нужен ассембер, я против его использовани. Скорее всего и другием тоже ничего не дало, по другим причинам.

Задания на наследование и рядом не стоят с заданиями на глубину познания компилятора.

Цитата(aktuba @  21.10.2008,  20:59 Найти цитируемый пост)
Об этом и сказал выше. Такая "нужность" мало кому нужна. Очень мало. Потоки или графика или, даже, сеть, нужна куда чаще.

А мне за это приличные деньги платят...



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


Смышленный
***


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

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



Цитата(Rrader @  21.10.2008,  15:03 Найти цитируемый пост)
Есть два типа людей - одни постоянно спрашивают, куда катится этот мир? А другие катят его.

Нее, дело не в этом. Вопросы задаются, чтобы получать на них ответы. Задания дааются чтобы их решать. Данное задание было описано так, что для всех запрещено вызывать конструктор, а для "правильного" решения можно. Это не препирательство, хотелось бы на будущее исключить подобные казусы. Поэтому и предлагаю исключить на будущее подобные, бессмысленные, задания.

Добавлено через 8 минут и 9 секунд
Цитата(Rrader @  21.10.2008,  15:03 Найти цитируемый пост)
А мне за это приличные деньги платят...

А мне и без этого платят не плохо ;) Дело то не в этом. Такие задания, да еще с такой формулировкой, ОЧЕНЬ мало кому понятны и нужны. Отметьте для себя на будущее.


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


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



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

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



Модератор: хватит уже спорить!!! Вы еще поругайтесь!!!


aktuba, если подобные задания будут исключены, лично я врядли буду принимать участие в конкурсе. Вы путаете вызов конструктора, и взятие его адреса.
И действительно, в задании была подсказка:

Цитата

Зная адрес конструктора, его можно вызвать


Все, будьте разумными, хватит спорить из за какого то задания.
PM   Вверх
Rrader
  Дата 21.10.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

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



aktuba
Poseidon

Тем не менее, Вы не решили это задание никаким образом. Ни через Create, ни через NewInstance. Тема закрыта.


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


Амеба
Group Icon


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

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



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


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

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

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


Inspired =)
***


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

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



В общем, мне жаль, что так остро все приключилось.
aktubaPoseidon, в следующем конкурсе будем участвовать вместе smile 

Это сообщение отредактировал(а) Rrader - 21.10.2008, 14:44


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


Смышленный
***


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

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



Цитата(Rrader @  21.10.2008,  15:26 Найти цитируемый пост)
Тем не менее, Вы не решили это задание никаким образом. Ни через Create, ни через NewInstance. Тема закрыта. 

Ну я и не решал, о чем и предупредил заранее.
Цитата(THandle @  21.10.2008,  15:21 Найти цитируемый пост)
aktuba, если подобные задания будут исключены, лично я врядли буду принимать участие в конкурсе. Вы путаете вызов конструктора, и взятие его адреса.

Ну а я наоборот - с такими не буду принимать участие. Так что предлагаю делать через раз ;)


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Rrader
  Дата 21.10.2008, 15:45 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

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



Вот еще как можно, совсем не вызывая конструктор напрямую, не получая его адрес по имени: smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

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

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

function CreateClass(FTypeInfo: Pointer;
  Alloc: Boolean; Value: Integer): TDummy;
type
  TCreator = function(FTypeInfo: Pointer;
    Alloc: Boolean; Value: Integer): TDummy;
var
  Creator: TCreator;
begin
  if Alloc then
    Creator := TCreator(PPointer(Integer(FTypeInfo) + 4)^)
  else
    Creator := TCreator(PPointer(PInteger(FTypeInfo)^ + 4)^);
  Result := Creator(FTypeInfo, Alloc, Value);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Dummy: TDummy;
begin
  Dummy := CreateClass(TDummy, True, 100);
  CreateClass(Dummy, False, 100);
  Dummy.Free;
end;

end.


Это сообщение отредактировал(а) Rrader - 21.10.2008, 15:47


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


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


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

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



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

Добавлено через 31 секунду
и вообще в защиту составителей задач - все задачи по-своему интересны) в т.ч. и 3я.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
jsa
Дата 22.10.2008, 04:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Rrader @  21.10.2008,  19:03 Найти цитируемый пост)
В задании было запрещено только вызывать конструктор с параметром. И приведен пример, как делать нельзя. В самом задании была дана подсказка: "Зная адрес конструктора, его можно вызвать"

так и думал что надо получать адрес конструктора, но как это сделать если экземпляр класса не существует? значит должен существовать некий прелоадер классов, который получает данные о классе (я так думаю что и есть VMT), и потом уже выполняетя конструктор
если так, то можно ли получить доступ к этому некоему прелоадеру используя чистый паскаль, без ассемблера
Цитата(Rrader @  21.10.2008,  20:45 Найти цитируемый пост)

Код



function CreateClass(FTypeInfo: Pointer;  Alloc: Boolean; Value: Integer): TDummy;
type  TCreator = function(FTypeInfo: Pointer;    Alloc: Boolean; Value: Integer): TDummy;
var  Creator: TCreator;
begin  
if Alloc then    Creator := TCreator(PPointer(Integer(FTypeInfo) + 4)^)  else    Creator := TCreator(PPointer(PInteger(FTypeInfo)^ + 4)^);  
Result := Creator(FTypeInfo, Alloc, Value);
end;


уверен что это не единственный способ вызвать конструктор не напрямую


Это сообщение отредактировал(а) jsa - 22.10.2008, 04:45


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Poseidon
Дата 22.10.2008, 08:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(Rrader @  21.10.2008,  15:45 Найти цитируемый пост)
Вот еще как можно, совсем не вызывая конструктор напрямую, не получая его адрес по имени:
Браво! Убедил! + smile



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


Эксперт
***


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

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



Цитата(Poseidon @  22.10.2008,  08:29 Найти цитируемый пост)
Браво! Убедил! +

Кстати, этот пример не сильно отличается от предыдущего.
Для начала заметим, что для его работы требуется, чтобы конструктор был виртуальным (не зря, наверное, в условии задачи приведено описание класса именно с виртуальным конструктором). Предыдущий пример работал бы с любым конструктором.
А проблема в этом примере в том, что мы всё равно должны иметь на руках больше информации, чем указатель на класс. В первом примере у нас на руках была информация: указатель на класс и адрес конструктора.
В этом примере адрес конструктора заменён на "волшебное число" (справка: волшебное число - это любое число, отличное от 0 и +/-1). Это число показывает смещение записи с адресом конструктора в VMT класса. Иными словами адрес конструктора мы заменили на информацию о его местонахождении. 
Это значит, что нам всё ещё необходимо знать что-то об устройстве класса: а именно, сколько он имеет виртуальных методов и как они располагаются относительно конструктора. В частности, если убрать или добавить методов до конструктора, то пример перестанет работать.

Добавлено через 7 минут и 30 секунд
Кстати, а как вам такая задачка на знание Delphi:

Код
function GetSomeObject: TSomeClass;
begin
  Result := nil;
  try
    Result := TSomeClass.Create;
    // ... действия с Result, его инициализиация, заполнение и т.п.
  except
    FreeAndNil(Result);  
  end;
end;


Это функция, которая создаёт, заполняет и возвращает новый объект. Если объект создать нельзя - функция возвращает nil.
Вопрос: может ли функция возбудить исключение? 
Не в смысле, что исключение просто будет возбуждено внутри функции - понятно, что в ... может прямо стоять raise. А с смысле, может ли исключение выйти наружу функции? Т.е. может ли код, вызывающий эту функцию, словить exception? Если нет, то объяснить почему ;)


--------------------
Опытный программист на 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.1665 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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