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

Вниз

"Проверь себя". Тест для начинающих.   Найти похожие ветки 

 
begin...end ©   (2005-08-03 19:07) [0]

Что такое класс? Что такое экземпляр класса? Как работает объект?

Часто в "Основной" конференции новички (и, к сожалению, не только новички) демонстрируют частичное или полное непонимание этого.

У меня есть несколько вопросов (ответы на них я знаю), касающихся внутреннего устройства объектов (не тех, которые object, а тех, которые экземпляры class) в Delphi. Эти вопросы я когда-то придумал сам (что называется, "от нечего делать"). Ни в коей мере не претендуя на роль учителя, предлагаю тем начинающим, кому это интересно, попробовать ответить на них. Возможно, у кого-нибудь в результате появится желание самостоятельно разобраться в этих или других вопросах программирования в Delphi. Ну а если это приведёт к уменьшению числа "слишком простых" вопросов в "Основной", то, думаю, все от этого только выиграют.

Подчеркну, что вопросы адресованы, в первую очередь, именно начинающим, поэтому прошу уважаемых Мастеров пока не давать своих ответов.

Вопросы я постарался расположить в порядке увеличения их сложности. Итак, начнём:

1. Возникнет ли исключение при выполнении кода TObject(nil).Free? А при выполнении TObject(nil).Destroy? Почему?

2. Возникнет ли исключение при выполнении выделенной строки в коде:

var
 C: TControl;
begin
 C := TControl.Create(nil);
 C.Free;
 C.Free
end


и почему?

3. Имеется класс:

type
 TMyClass = class
   class function ClassMethod: Integer;
   function Method: Integer;
 end;

class function TMyClass.ClassMethod: Integer;
begin
 Result := Integer(Self)
end;

function TMyClass.Method: Integer;
begin
 Result := Integer(Self)
end.


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

4. Будет ли создан экземпляр класса (т.е. будет ли выделена память для него) при выполнении выделенной строки?

var
 Obj: TObject;
begin
 Obj.Create
end.


5. Возникнет ли исключение при выполнении выделенной строки? Почему?

interface

type
 TMyClass = class
   procedure Method;
 end;

implementation

procedure TMyClass.Method;
begin
 ShowMessage("AV or not AV?")
end;

var
 C: TMyClass;
begin
 C := nil;
 C.Method
end.


Изменится ли ситуация, если метод Method сделать виртуальным? Почему?

6. Какое сообщение появится на экране после выполнения выделенной строки:

type
 TMyClass = class
   FWord: Word;
 end;

var
 C: TMyClass;
 B: Byte;
begin
 C := TMyClass.Create;
 try
   C.FWord := 512;
   B := PByte(Longword(C) + 4)^;
   ShowMessage(IntToStr(B))
 finally
   C.Free
 end
end


и почему?

7. Какое сообщение появится на экране после выполнения приведённого ниже кода? Почему?

interface

type
 TExObject = class
   IntField: Integer;
   procedure Show;
 end;

implementation

procedure TExObject.Show;
begin
 ShowMessage(IntToStr(IntField))
end;

const
 Arr: array [1..3] of Integer = (123, 456, 789);
begin
 TExObject(@Arr).Show
end.


8. Чему будет равно выделенное условие -- True или False? Почему? И что в этом условии сравнивается?

var
 Obj1: TObject;
 Obj2: TComponent;
begin
 Obj1 := TControl.Create(nil);
 Obj2 := TControl.Create(nil);
 try
   if PPointer(Obj1)^ = PPointer(Obj2)^ then
     Beep
 finally
   Obj1.Free;
   Obj2.Free
 end
end.


9. Какой метод будет вызван при выполнении выделенной строки -- DoVirt1 или DoVirt2? Почему?

interface

type
 TMyClass = class
   procedure DoVirt1; virtual;
   procedure DoVirt2; virtual;
 end;

implementation

procedure TMyClass.DoVirt1;
begin
end;

procedure TMyClass.DoVirt2;
begin
end;

var
 C: TMyClass;
 P: Pointer;
begin
 C := TMyClass.Create;
 try
   P := PPointer(C)^;
   P := Pointer(Longword(P) + 4);
   P := PPointer(P)^;
   asm
     MOV   EAX, C
     CALL  [P]
   end
 finally
   C.Free
 end
end.


В каких случаях первую строку ассемблерной вставки можно убрать (с сохранением работоспособности кода), а в каких -- нет?
Будет ли этот пример работать также, если виртуальные методы в классе TMyClass заменить на динамические? Почему?

10. Какое сообщение появится на экране после выполнения выделенной строки? Почему?

interface

type
 TFirstClass = class
   FInteger: Integer;
   procedure VirtMethod; virtual;
 end;

 TSecondClass = class
   FInteger: Integer;
   procedure VirtMethod; virtual;
 end;

implementation

procedure TFirstClass.VirtMethod;
begin
 ShowMessage(Format("Метод класса TFirstClass, FInteger = %d", [FInteger]))
end;

procedure TSecondClass.VirtMethod;
begin
 ShowMessage(Format("Метод класса TSecondClass, FInteger = %d", [FInteger]))
end;

var
 FirstObj: TFirstClass;
 SecondObj: TSecondClass;
 P: Pointer;
begin
 FirstObj := TFirstClass.Create;
 SecondObj := TSecondClass.Create;

 FirstObj.FInteger := 1;
 SecondObj.FInteger := 2;

 P := PPointer(FirstObj)^;
 PPointer(FirstObj)^ := PPointer(SecondObj)^;
 FirstObj.VirtMethod;
 PPointer(FirstObj)^ := P;

 FirstObj.Free;
 SecondObj.Free
end.


Вот, собственно, и все вопросы.


 
Kerk ©   (2005-08-03 19:13) [1]

Ничего так вопросы.. на brainbench"евские смахивают :)
Про class of забыл еще спросить :)


 
pasha_golub ©   (2005-08-03 19:25) [2]

Давно не обновлялся, но думаю актуальности в связи с веткой не потерял:

http://www.farata.kr.ua/testsonline/


 
TStas ©   (2005-08-03 19:27) [3]

А хорошие вопросы, ответить попробую. Так дыры в знаниях хорошо у себя выявлять.


 
Piter ©   (2005-08-03 19:28) [4]

Все не читал, но бросилось в глаза:

begin...end ©   (03.08.05 19:07)
4. Будет ли создан экземпляр класса (т.е. будет ли выделена память для него) при выполнении выделенной строки?

var
Obj: TObject;
begin
Obj.Create
end.


и какой же правильный ответ?


 
begin...end ©   (2005-08-03 19:32) [5]

> Piter ©   (03.08.05 19:28) [4]

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


 
Piter ©   (2005-08-03 19:37) [6]

begin...end ©   (03.08.05 19:32) [5]

тьфу ты. Подумалось, что написано:

TObj.Create


 
Piter ©   (2005-08-03 19:43) [7]

я бы тогда в 4-ом вопросе вырезал строчку:

>(т.е. будет ли выделена память для него)

ибо она открывает ответ и наводит на мысли о том, будет ли вызван NewInstance или нет...
Типа подсазка :)


 
Piter ©   (2005-08-03 20:09) [8]

pasha_golub ©   (03.08.05 19:25) [2]
Давно не обновлялся, но думаю актуальности в связи с веткой не потерял:

http://www.farata.kr.ua/testsonline/


блин... Сложный тест!


 
jack128 ©   (2005-08-03 20:28) [9]

begin...end ©   (03.08.05 19:07)
Что такое класс? Что такое экземпляр класса? Как работает объект?

Часто в "Основной" конференции новички (и, к сожалению, не только новички) демонстрируют частичное или полное непонимание этого.


ИМХО, для того чтобы написать грамматную программу, нужно знать лишь ответ на 3ий и 4ый вопрос. Всё остальное - жуткие техническии подробности и опираться знание этих подробностей при написании программы - как раз таки признак плохого стиля..


 
jack128 ©   (2005-08-03 20:36) [10]

jack128 ©   (03.08.05 20:28) [9]
и опираться НА знание этих подробностей


 
pasha_golub ©   (2005-08-03 20:41) [11]

Piter ©   (03.08.05 20:09) [8]
блин... Сложный тест!
Если не подколка, то рад слышать. Для того и создавался.


 
begin...end ©   (2005-08-03 20:52) [12]

> jack128 ©   (03.08.05 20:28) [9]

> ИМХО, для того чтобы написать грамматную программу,
> нужно знать лишь ответ на 3ий и 4ый вопрос.

Что ж, возможно. Спорить не буду, так как профессиональным программистом (в обоих смыслах этого слова -- а) специалистом в области программирования и б) работающим в качестве программиста) не являюсь.

> Всё остальное - жуткие техническии подробности и
> опираться знание этих подробностей при написании
> программы - как раз таки признак плохого стиля..

Писать, например, код, подобный [9], в программе -- несомненно, признак плохого стиля. А вот понимать этот код (понимать то, почему он работает так, а не иначе) -- хоть и не обязательно, конечно, но всё же полезно. Тоже ИМХО.


 
Ego   (2005-08-03 21:18) [13]

Простие, не совсем в тему.Я начал изучать "Паскаль", ещё в те времена, когда водка стоила 98 рублей.У меня дома стоял БК - 01, поэтому, разумеется, основными языками для меня были "Фокал" и "Бейсик".Когда я узнал о существовании ООП, для меня это было, как для неандертальца консервная банка.Я, конечно, попытался в этом разобраться, но единственный вывод, который сделал: проблема, только в алгоритме, а всё остальное можно в книгах найти.Простите, что я всё о себе, но это мне наиболее близко.Я никогда не писал "скриптов" на "перл" - появилась задача, я придумал алгоритм, взял книжку по "перл" и "пересобачил" свои мысли в "скрипты".Конечно, я делал это гораздо дольше, чем тот человек, который общается с этим каждый день.Но, ведь, сделал.По-моему, это не тест на профессионализм, а тест на "начитку."


 
begin...end ©   (2005-08-03 21:36) [14]

> Ego   (03.08.05 21:18) [13]

> По-моему, это не тест на профессионализм, а тест на
> "начитку."

А разве кто-то говорил, что это тест на профессионализм?

Ответы на большинство предложенных вопросов можно найти, выполнив 3 действия:

1) почитав справку;
2) посмотрев исходники RTL;
3) немного подумав.

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

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


 
DiamondShark ©   (2005-08-03 21:52) [15]

Это тест на лень.


 
Piter ©   (2005-08-03 22:03) [16]

pasha_golub ©   (03.08.05 20:41) [11]
Если не подколка, то рад слышать. Для того и создавался


да какая тут подколка! То есть, лично для меня сложный

Правда, с некоторыми вопросами я не очень согласен и времени мало дается, особенно на некоторые вопросы.

Но в целом блин рулит. Занес в закладки.


 
pasha_golub ©   (2005-08-04 04:36) [17]

Piter ©   (03.08.05 22:03) [16]
Но в целом блин рулит. Занес в закладки.

Не знаю... Стоит ли. Сайт уже вот год-полтора не обновляется. Шото нету желания. :-(


 
12DFBDDh ©   (2005-08-04 07:07) [18]

ты наверное либо ЧАВО решил написать либо книгу


 
Holy ©   (2005-08-04 09:14) [19]

Интересный тест... Но мне сказали, что я его прошел...
Цитирую

Уважаемый (ая) DimON, Вы набрали 21 очков.
Результат Вашего теста лучше чем 558 результат (а, ов), имевших место до Вас.
Спасибо за прохождение теста


Что-то я не чуствую себя хоть чуток знающим Делфи, хотя и на retratech получил сертификат по Делфи5... Видимо действительно многие вопросы из этих тестов могут быть быстро решены при помощи F1...


 
jack128 ©   (2005-08-04 10:44) [20]

Holy ©   (04.08.05 9:14) [19]
Интересный тест... Но мне сказали, что я его прошел...
Цитирую

Уважаемый (ая) DimON, Вы набрали 21 очков.
Результат Вашего теста лучше чем 558 результат (а, ов), имевших место до Вас.
Спасибо за прохождение теста

Что-то я не чуствую себя хоть чуток знающим Делфи, хотя и на retratech получил сертификат по Делфи5... Видимо действительно многие вопросы из этих тестов могут быть быстро решены при помощи F1

Правельно чувствуешь. максимум ты мог набрать 50 очков, так что...


 
Rule ©   (2005-08-04 12:00) [21]

pasha_golub ©   (03.08.05 19:25) [2]
не хватает вопросов бо базам данных


 
Суслик ©   (2005-08-04 12:28) [22]

поддерживаю Jack128
технические подробности незачем использовать, знать надо, но использовать нет.

ЗЫ.
Хотя вот тут Коншин приводил пример передачи параметров в NewInstance с целью организации своего менеджера памяти для объектов.


 
Ega23 ©   (2005-08-04 12:50) [23]

2 pasha_golub ©   (03.08.05 19:25) [2]

Вопросы понравились. Только вот не сразу понял, что можно сразу несколько выриантов выбирать, и не сразу секундомер с обратным отсчётом заметил...


 
pasha_golub ©   (2005-08-04 12:54) [24]

Rule ©   (04.08.05 12:00) [21]
Создавай, вставлю. :0) Токо вот каким образом БД к Делфи привязать, кроме как TDataset не знаю.


 
Piter ©   (2005-08-04 12:55) [25]

Holy ©   (04.08.05 9:14) [19]
Видимо действительно многие вопросы из этих тестов могут быть быстро решены при помощи F1...


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


 
pasha_golub ©   (2005-08-04 13:00) [26]

Ega23 ©   (04.08.05 12:50) [23]
Вроде написано было. Там, кстати, за грубые ошибки очки снимаются.


 
Ega23 ©   (2005-08-04 13:07) [27]

Вроде написано было. Там, кстати, за грубые ошибки очки снимаются.

Значит не прочитал...


 
pasha_golub ©   (2005-08-04 13:22) [28]

Более того, даже писал, что пользоваться средой и хелпом можно и нужно.

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


 
Piter ©   (2005-08-04 14:04) [29]

pasha_golub ©   (04.08.05 13:22) [28]
а не знать на зубок дерево иерархий классов


в тоже время такие вопросы в твоем тесте встречаются :)


 
Суслик ©   (2005-08-04 14:09) [30]

что-то у меня сайт Павла Голубя тормиозит непадецки.


 
Суслик ©   (2005-08-04 14:15) [31]

Кстати, в вопросах по object pascal вопрос с absolute и set of.

Вообще говоря я не прочел (забыл) к какой версии языка это относится, но думаю, что вопрос не совсем корректный, т.к. memory managment в delphi не стандартизирован и может меняться от версии к версии. Насколько я помню в delphi2005 в хелпе раздела memory managment (т.е. как в памяти хранятся различные переменные) вообще нет. Т.е. я не очень вижу ценности знания о том, как скажем организована память под set. Я сам перестал пользоваться фактами знания физической реализации того или иного типа (пожалуй, только пользуюсь изредка знанием того, что байты в целом хранятся в обратном порядке). Хотя, конечно, ценность таких знаний сильно зависит от задачи.

PS. Прошу не кидаться обидными словами. Все сказанное - мое личное мнение.


 
Rule ©   (2005-08-04 14:32) [32]

pasha_golub ©   (04.08.05 12:54) [24]
точно такоеже отношение как и WINAPI к делфи, и если пошла уж такая жара, то давай если придираться к мелочам, то делфи - это не язык, а интегрированая среда разработки, тогда это тест по Object Pascal


 
Opilki_Inside ©   (2005-08-04 14:35) [33]

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

pasha_golub, а дата прохождения теста 2003 года стоит...


 
Opilki_Inside ©   (2005-08-04 14:39) [34]

Rule © Делфи с некоторых пор уже называется полноценным языком программирования.


 
Piter ©   (2005-08-04 14:47) [35]

Rule ©   (04.08.05 14:32) [32]
и если пошла уж такая жара, то давай если придираться к мелочам, то делфи - это не язык, а интегрированая среда разработки


с новым годом, Rule!

Borland уже давным-давно (перед выходом D7) официально переименовал Object Pascal в Delphi Language.


 
pasha_golub ©   (2005-08-04 14:49) [36]

Суслик ©   (04.08.05 14:15) [31]
А тормозит он ибо 256Кб в теории, на практике меньше, плюс дневная нагрузка на канал.

Та не в коем случае. Токмо там везде стоит packed, хотя конечно вопрос не однозначный. Как с точки зрения знаний, так и актуальности. Согласен.

Opilki_Inside ©   (04.08.05 14:35) [33]
pasha_golub, а дата прохождения теста 2003 года стоит...

У кого? Чего-то я не допонял.


 
pasha_golub ©   (2005-08-04 14:50) [37]

Суслик ©   (04.08.05 14:15) [31]
А тормозит он ибо 256Кб в теории, на практике меньше, плюс дневная нагрузка на канал.

Та не в коем случае. Токмо там везде стоит packed, хотя конечно вопрос не однозначный. Как с точки зрения знаний, так и актуальности. Согласен.

Opilki_Inside ©   (04.08.05 14:35) [33]
pasha_golub, а дата прохождения теста 2003 года стоит...

У кого? Чего-то я не допонял.


 
Ega23 ©   (2005-08-04 14:52) [38]

2 pasha_golub ©   (04.08.05 14:50) [37]
У кого? Чего-то я не допонял.

Причём, смотрю, 2 раза недопонял....  :о)


 
Суслик ©   (2005-08-04 14:55) [39]


>  [36] pasha_golub ©   (04.08.05 14:49)

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

ЗЫ.
Я видел, кто у тебя на сайте отвечал. Ув. господа, никто не оспаривает вашего знания дельфи и мастерства. Я только выразил сомнения по поводу абсолютной необходимости такого знания. Да, нужно знать, что pointer(от word) указывает не на левый байт (старший), а на правый (младший). Это вообще общая практика для всех языков программирования, где есть работа с памятьсяю. Но твердо знать, как устроен set в Delphi и полагаться на это, мне кажется рисковым.


 
pasha_golub ©   (2005-08-04 14:56) [40]

Ega23 ©   (04.08.05 14:52) [38]
Глук! :0)



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

Форум: "Потрепаться";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.013 c
14-1123488820
kblc
2005-08-08 12:13
2005.09.04
Compiler ...


4-1121286315
ronyn
2005-07-14 00:25
2005.09.04
Счётчик для Интернета.


5-1097640774
3fc
2004-10-13 08:12
2005.09.04
Проблема с ActiveX-контролом: "control ... has no parent window"


3-1122359673
777
2005-07-26 10:34
2005.09.04
доступ к результатам запроса


2-1069204073
Ciber SLasH
2003-11-19 04:07
2005.09.04
Чё за ошибка такая





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