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

Вниз

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

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

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


 
Opilki_Inside ©   (2005-08-04 14:58) [41]

pasha_golub ©

у меня все новости на сайте за 2003 год. это правильно? и еще дата прохождения моего теста: 2003-11-18 02:59:54
хотя проходил я его 5 минут назад...


 
pasha_golub ©   (2005-08-04 14:59) [42]

Суслик ©   (04.08.05 14:55) [39]
Ты меня не понял.

Фраза "ни в коем случае" означала, что я с тобой, дорогой животный, абсолютно согласен. :0)

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


 
pasha_golub ©   (2005-08-04 15:01) [43]

Opilki_Inside ©   (04.08.05 14:58) [41]
Про новости правда. А вот про прохождение теста, это видимо у меня где-то недочет.


 
Rule ©   (2005-08-04 15:09) [44]

Opilki_Inside ©   (04.08.05 14:39) [34]
Piter ©   (04.08.05 14:47) [35]

ну и что в нем координально изменилось, кроме названия естественно ?


 
Opilki_Inside ©   (2005-08-04 15:19) [45]

Rule © Просто ты решил "придираться к мелочам" и сказал что Делфи это не язык. Так вот если уж "придираться к мелочам", то делфи это язык. А причем тут вобще его изменения? Речь ведь о мелочах идет :)


 
Rule ©   (2005-08-04 15:27) [46]

Opilki_Inside ©   (04.08.05 15:19) [45]

согласен, здаюсь ...


 
pasha_golub ©   (2005-08-04 15:30) [47]

Rule ©   (04.08.05 15:27) [46]
Приезжай в гости. Сегодня! Пока есть возможность... ;-)


 
Rule ©   (2005-08-04 15:33) [48]

pasha_golub ©   (04.08.05 15:30) [47]
сегодня не могу, сегодня мальчишник, на выходные друг жениться, а я свидетель, по этому не могу, долг :-)


 
Piter ©   (2005-08-04 15:49) [49]

Rule ©   (04.08.05 15:27) [46]
согласен, здаюсь ...


вот так бы сразу - а то сначала придрался, а потом "ну и что в неи изменилось, кроме названия?" :)))


 
pasha_golub ©   (2005-08-04 16:33) [50]

Rule ©   (04.08.05 15:33) [48]
Помощь нужна? ;0)


 
begin...end ©   (2005-08-04 17:51) [51]

> DiamondShark ©   (03.08.05 21:52) [15]

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

> 12DFBDDh ©   (04.08.05 7:07) [18]

Вовсе нет. Да и какое я имею на это моральное право, не являясь профессиональным программистом?

> Суслик ©   (04.08.05 12:28) [22]

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

А чтобы их знать -- надо, как минимум, уметь пользоваться документацией. О чём и было сказано в [14].

И цель теста (по крайней мере, моего) -- вызвать "спортивный интерес" у новичков и заставить их "откопать" ответ.

Как бы там ни было, ветка ушла в сторону (как это у нас обычно и бывает), а ни одного ответа от начинающих программистов хотя бы на один вопрос из [0] пока не последовало. Возможно, они ещё будут, а возможно и нет -- может быть, тест показался совсем неинтересным или слишком сложным.

А может быть, никто из прочитавших вопросы не посчитал себя новичком? :-)

Что ж, подождём...


 
lookin ©   (2005-08-04 17:53) [52]

[51] begin...end ©   (04.08.05 17:51)
>>Что ж, подождём...

Я все равно неправильно отвечу, так что воздержусь...


 
Digitman ©   (2005-08-04 18:10) [53]


> begin...end ©   (03.08.05 19:07)  


тест, бесспорно, хорош.
проблема лишь в том, что участник его, якобы успешно прошедший и не имеющий ничерташеньки понятий о МУЛЬТИЗАДАЧНОСТИ, возьмет тест-код на вооружение ..


 
begin...end ©   (2005-08-04 18:35) [54]

> Digitman ©   (04.08.05 18:10) [53]
> ... возьмет тест-код на вооружение

О том, что такой код не надо брать на вооружение, говорилось здесь уже неоднократно. В том числе, и мной -- в [12].


 
Ptr   (2005-08-04 19:12) [55]

При ответах пользовался Delphi

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

Метод Free проверяет на nil указатель на экземпляр и только тогда вызывает Destroy.
При Free - исключения не будет. При Destroy - будет.

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

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


Возникнет. Метод Free не устанавливает ссылку на nil, для этого есть FreeAndNil

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

как оказалось, в классовый метод в качестве параметра Self передается ссылка не на экземпляр класса, а на сам класс. Адрес класса и адрес экземпляра класса различаются.

Как нужно изменить код одного из методов, чтобы возвращаемые значения были одинаковыми?

например, так:

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


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

память не будет выделена, так как не будет вызван NewInstance. Зато будет вызван конструктор класса

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

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

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

а если метод виртуальный, то вероятно при поиске в VMT используется конкретный экземпляр класса, а он nil.
Вообще про VMT я ничего не знаю, так, слышал, поэтому точно не представляю, но что-то типа того.

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

Ну это надо знать поадресную структуру класса.
На каком смещении от ссылки на экземпляр класса идут значения полей и т.д. Я этого не знаю. ПО-моему, действительно лишняя информация.

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

аналогично 6.

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

а вот фиг знает.
Почему-то: PPointer(Obj1) = Pointer(Obj1)

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

не знаю. Я ассемблера то не знаю. И опять эти PPointer

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

опять эти PPointer, даже разбираться не стал, почему бы сразу не писать:

PPointer(TMyClass(Pointer(Class.Value)^).SomeMethod(PByte(LongWord(@CoolClass)+4)^))


 
begin...end ©   (2005-08-04 19:42) [56]

> Ptr   (04.08.05 19:12) [55]

Ответы на вопросы с 1-го по 4-й -- правильные. Возможно и ещё одно решение 3-го вопроса, но это неважно. Ответ на 5-й вопрос неполон.

Результат, ИМХО, очень хороший.

По крайней мере, не раз приходилось видеть, как некоторые из отвечающих (!) в "Основной" показывают незнание, например, даже 1-го или 2-го вопроса. Конечно, не забывая при этом убеждать окружающих в своей крутости.

Ждём ответов на оставшиеся вопросы. Для ответа на них тоже, в основном, достаточно того, что перечислено в [14].


 
Суслик ©   (2005-08-04 19:44) [57]

prt
Ты тут сейчас прослывешь знатоком дельфи - тебя все на работу захотят взять :)

Завтра почту починят - напишу.


 
Fay ©   (2005-08-04 20:08) [58]

2 begin...end ©   (03.08.05 19:07)
>> Тест для начинающих.
А что начинают делать люди, для которых составлен этот тест?


 
begin...end ©   (2005-08-04 20:57) [59]

> Fay ©   (04.08.05 20:08) [58]

Поскольку этот сайт называется "Мастера Delphi", то можно предположить, что под словом "начинающие" имелось в виду "начинающие программировать на Delphi". Логично, не правда ли?


 
Ptr   (2005-08-04 21:13) [60]

>Ты тут сейчас прослывешь знатоком дельфи - тебя все на работу
>захотят взять :)

да ладно... Я уверен, что очень многие знают отличие Destroy от Free.

Суслик, а вы наверняка правильно ответите на все 10 вопросов, так что какой из меня знаток...


 
pasha_golub ©   (2005-08-05 01:17) [61]

begin...end ©   (04.08.05 20:57) [59]
Начинающие Мастера Делфи...

Человек, владеющий алгоритмическим мышлением, но однако, не имевший дело с Делфи, фиг на них ответит. Ибо много архитектурных зависимостей, ИМХО.


 
12DFBDDh ©   (2005-08-05 07:32) [62]

1.1 нет
1.2 да
2 да
3 вызываются два разных обьекта self
4 нет
5 вызовет не существует обьект класса
6 честно не понял
7 адресс массива
8 сравниваются два адресса они не равны созданы два разных обьекта в памяти
9 первый метод doVirt1
10 PPointer(FirstObj)^ := PPointer(SecondObj)^;
FirstObj.VirtMethod;
метод TFirstClass.VirtMethod;

Да похоже я не мастер ((


 
Суслик ©   (2005-08-05 10:45) [63]


>  [60] Ptr   (04.08.05 21:13)


> Суслик, а вы наверняка правильно ответите на все 10 вопросов,
> так что какой из меня знаток...


Не уверен.
Если человек ответил на все, это не значит, что он умеет делать ДЕЛА.

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

ЗЫ. Напиши, кстати - у меня почту починили.


 
begin...end ©   (2005-08-05 17:20) [64]

> 12DFBDDh ©   (05.08.05 07:32) [62]

Желательно приводить ещё и обоснования ответов, ведь каждый вопрос содержит слово "почему".

:-)


 
12DFBDDh ©   (2005-08-08 07:21) [65]

begin...end ©   (05.08.05 17:20) [64]
ВВВВВллллооооммммм


 
Игорь Шевченко ©   (2005-08-08 10:58) [66]

А мне вопросы понравились :)


 
begin...end ©   (2005-08-08 15:00) [67]

Поскольку на вопросы 1 - 4 уже были даны исчерпывающие ответы (см. [55]), отвечу лишь на оставшиеся.

5. Исключения здесь не возникнет, и вот почему. Во-первых, как было указано в [55], метод Method -- статический, он имеет один и тот же адрес для всех экземпляров TMyClass. Это означает, что для вычисления адреса метода не потребуется значение ссылки на объект, которая в данном случае равна nil, т.е. недействительна. Во-вторых, внутри метода такая же ситуация: метод не обращается к полям и не вызывает виртуальные или динамические методы -- а значит, ссылка на объект внутри метода тоже не понадобится. Следовательно, и исключению взяться неоткуда. Если же метод Method сделать виртуальным, то исключение будет, поскольку при вычислении адреса виртуального метода используется значение ссылки на объект (см. ответ на вопрос 9).

6. Появится сообщение "0". Переменная классового типа (когда объект создан) представляет собой указатель на область памяти, первые четыре байта которой -- это указатель на таблицу виртуальных методов (ТВМ), а оставшаяся часть области -- это поля объекта (причём поля не только данного класса, но и всех его предков, в порядке наследования). В данном случае класс TMyClass является потомком TObject, у которого нет полей. Следовательно, по смещению +4 от начала экземпляра класса находится первое поле объекта класса TMyClass. Мы получаем первый байт этого поля. Если поле типа Word равно 512, то первый (младший) байт этого поля равен 0. Возможно, более наглядно это покажет отладчик. Например, у меня он показал, что в памяти по адресу, содержащемуся в переменной C, находится следующее содержимое:

D4 79 45 00 00 02 ...

Первые 4 байта -- это ссылка на ТВМ. Она в данном случае равна $004579D4 (не забываем про принцип расположения данных в памяти -- младший байт по младшему адресу). Далее идёт значение первого поля -- первый его байт (он выделен) равен $00 (который мы и получили), а всё поле (оно же у нас двухбайтовое -- Word) равно $0200, т.е. 512.

7. Появится сообщение "456". Причины разъяснены в ответе на предыдущий вопрос. Коротко: для обращения к полю IntField компилятор прибавляет к ссылке на объект 4 -- чтобы "пропустить" указатель на ТВМ. А значит, получается указатель на второй элемент массива Arr.

8. Выделенное условие будет равно True. В этом условии сравниваются указатели на ТВМ. В данном случае у объектов Obj1 и Obj2 эти таблицы одинаковы (а значит, одинаковы и указатели на них), поскольку оба объекта являются экземплярами одного и того же класса -- TControl. Тип переменных Obj1 и Obj2 здесь значения не имеет -- важно то, что в обоих случаях был вызван конструктор одного и того же класса.

9. Будет вызван метод DoVirt2. В строке P := PPointer(C)^ получается указатель на начало ТВМ. ТВМ -- это область памяти, в которой последовательно расположены адреса виртуальных методов данного класса (включая, конечно, и виртуальные методы предков -- та же песня, что и с полями). Каждый адрес (Pointer) занимает, разумеется, 4 байта. Поскольку TMyClass является прямым потомком TObject, у которого нет виртуальных методов (не считая методов, расположенных по отрицательному смещению), то сразу получается указатель на адрес первого виртуального метода класса TMyClass -- а именно, метода DoVirt1. Кстати, ссылка на ТВМ хранится в свойстве TObject.ClassType, поэтому данную строку можно было заменить на такую: P := C.ClassType (такую же замену можно было сделать и в коде вопроса 8). Далее, в строке P := Pointer(Longword(P) + 4) получается указатель на адрес следующего метода -- DoVirt2. Наконец, в строке P := PPointer(P)^ получается сам адрес метода DoVirt2, и этот метод вызывается в строке CALL  [P]. Первую строку ассемблерной вставки (передачу Self) можно убрать в случаях, когда внутри метода нет обращения к полям и виртуальным методам (о причинах этого см. ответ на вопрос 5). Если виртуальные методы в классе TMyClass заменить на динамические, пример перестанет работать, потому что адреса динамических методов вычисляются совсем по-другому.

10. Появится сообщение "Метод класса TSecondClass, FInteger = 1". TSecondClass -- потому что в строке PPointer(FirstObj)^ := PPointer(SecondObj)^ у объекта FirstObj был заменён указатель на ТВМ. Теперь объект FirstObj пользуется ТВМ класса TSecondClass. Ему (объекту), в общем-то, пофиг, какой таблицей пользоваться. Он просто вычисляет адрес нужного метода, пользуясь имеющейся у него таблицей, и вызывает его. А то, чей это на самом деле метод -- ему по барабану. Ну а FInteger = 1 -- потому что ссылка на экземпляр TFirstClass (т.е. переменная FirstObj) не менялась, и она продолжает указывать на область памяти, в которой, в том числе, расположены поля FirstObj.

Что же надо было знать, чтобы ответить на эти вопросы?

1, 2 -- справка по TObject.Destroy. Ответ написан чёрным по белому: "Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy". Для уверенности можно было заглянуть в модуль System и посмотреть реализации Free и Destroy.

3 -- справка по Self. Открываем и читаем: "Within the implementation of a method, the identifier Self references the object in which the method is called". А ниже -- ссылка: "For information about Self in class methods, see Class methods". Переходим по ссылке и видим: "In the defining declaration of a class method, the identifier Self represents the class where the method is called". Вопрос, как говорится, "исперчен".

4 -- отладчик (CPU Window или обычная пошаговая трассировка с включённой галочкой Use Debug DCUs). Всё легко просматривается (см. [7]).

5 - 10 -- CPU Window или отладчик. Плюс знание принципа "младший байт по младшему адресу" (а ведь это -- одно из основных положений архитектуры IA-32). Структура VMT подробно описана в справке: "Предметный указатель - VMT". Там и про то, что такое VMT, и где указатель на неё, и как расположены поля -- всё написано.

Нужно было только найти. Но попытались найти всего 2 человека. Радует только то, что 2 > 0.


 
Юрий Зотов ©   (2005-08-08 15:33) [68]

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

Паш, зашел, отметился в WinAPI (то ли Кот Матроскин, то ли Пес Матраскин, не помню точно). ИМХО, этот тест несложный, 50 из 50 взял влегкую, хотя к истинным знатокам системы себя отнюдь не причисляю. Полагаю, что к этому тесту надо бы добавить более сложные вопросы, чтобы оценка была более дифференцированной, а то сейчас получается, что середнячок (это, типа, такие, как я) не отличается от настоящего гуру - у обоих 50.

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

Вот такие пожелания, прими их, как конструктивную критику. А все остальное понравилось.


 
имя   (2005-08-08 15:51) [69]

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


 
pasha_golub ©   (2005-08-08 16:02) [70]

Юрий Зотов ©   (08.08.05 15:33) [68]
Дык, без вопросов. Но, как видишь, я на детище свое забил. Ибо кроме вопросов по самому контенту возникают еще и административные, которые меня и добили.

Кстати, если кто хочет заняться, то поделюсь ответственностью. :0)


 
begin...end ©   (2005-08-09 10:51) [71]

> pasha_golub ©   (08.08.05 16:02) [70]

Прошёл тест по API (под ником "Тупой"). 48 из 50. Присоединяюсь к пожеланию [68] по введению более сложных вопросов.


 
pasha_golub ©   (2005-08-09 11:15) [72]

begin...end ©   (09.08.05 10:51) [71]
Да, дело в том, что как усложнить вопросы в этой тематике? задавать более специфические? По каким-то конкретным функциям? Так это уже не соображаловка включается, а просто поиск по хелпам


 
Игорь Шевченко ©   (2005-08-09 11:45) [73]

begin...end ©   (09.08.05 10:51) [71]


> Присоединяюсь к пожеланию [68] по введению более сложных
> вопросов.


Па-аехали...

1. Назовите одно преимущество и один недостаток использования реестра вместо отдельных файлов ini.

2. У мыши может быть 1,2 или 3 кнопки. Используются все типа мыши. Скрывает ли эти различия уровень HAL от остальной части операционной системы. Почему да или почему нет ?

3. Уровень HAL поддерживает дату, начиная от года 1601. Приведите пример приложения, в котором это свойство полезно.

4. Подсистема POSIX нужна для реализации сигналов в стиле UNIX. Если пользователь нажмет клавишу для сигнала Quit, будет ли он планироваться как DPC или APC ?

5. В интерфейсе Win32 нет сигналов (как в Unix). Если бы сигналы были введены, они могли бы относиться к процессам, потокам, и к тем, и к другим, ни к тем, ни к другим. Выскажите свое предложение, к чему их отнести, и объясните, чем хороша ваша идея.

6. Альтернатива использования DLL заключается в том, чтобы статически компоновать каждую программу точно с теми библиотечными процедурами, к которым она обращается. Если бы нужно было внедрить эту схему, где бы это имело больший смысл, на клиентах или на серверах?

7. Файл ntdll.dll экспортирует 1179 функциональных вызовов (в Win2k), тогда как файл ntoskrnl.exe экспортирует 1209 функциональных вызовов.
Является ли это ошибкой? чем вызвано это различие?

8. Объекты, управляемые менеджеров объектов, имеют переменных размер, у различных объектов могут быть разные размеры. Может ли объект начинаться с произвольного байта в невыгружаемом пуле ?

9. Назовите три причины, по которым процесс может завершиться.

10. Вызов функции Win32 WaitForMultipleObjects позволяет потоку
блокироваться на множестве объектов синхронизации, чьи дескрипторы передаются этой функции в виде параметров. Вызывающий поток отпускается, как только один из этих объектов получает сигнал. Может ли набор объектов включать в себя два семафора, один мьютекс и одну критическую область ?

11. Допустим, что квант времени установлен равным 20 мс и что текущий  поток с приоритетом 24 только что начал свой квант. Внезапно операция вывода завершается и поток с приоритетом 28 переходит в состояние готовности. Сколько времени ему придется ждать обслуживания?

(с) Эндрю Таненбаум


 
Суслик ©   (2005-08-09 12:10) [74]


> (с) Эндрю Таненбаум

я думал ты сам, Игорь, их придумал :)))
я сходу только на 10ый могу ответить.


 
Piter ©   (2005-08-09 13:06) [75]

Игорь Шевченко ©   (09.08.05 11:45) [73]

это не по WinApi.
Это вопросы по системному программированию. Да еще со знанием технологий Unix.


 
Игорь Шевченко ©   (2005-08-09 13:17) [76]

Piter ©   (09.08.05 13:06) [75]

Это вопросы после главы "Операционная система Windows".

"Вопросы по WinAPI" без понимания того, как работает система, считаю бесполезной тратой времени.


 
Андрей Жук ©   (2005-08-09 13:31) [77]


>
> "Вопросы по WinAPI" без понимания того, как работает
> система, считаю бесполезной тратой времени.

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


 
pasha_golub ©   (2005-08-09 13:36) [78]

Игорь Шевченко ©   (09.08.05 11:45) [73]
Ого... Круто! А можно ответы на эти вопросы увидеть?


 
Суслик ©   (2005-08-09 13:37) [79]

Вопросы на самом деле имхо хорошие. Знать ответы на них только большинству не обязательно. Но вопросы хорошие - есть над чем голову поломать и что почитать.


 
Игорь Шевченко ©   (2005-08-09 13:42) [80]

pasha_golub ©   (09.08.05 13:36) [78]

Ответы Таненбаум не приводит :)



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

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

Наверх





Память: 0.67 MB
Время: 0.016 c
2-1123234342
Smersh03-1
2005-08-05 13:32
2005.09.04
Летающие формы


1-1123751374
webpauk
2005-08-11 13:09
2005.09.04
RichEdit + ссылка


4-1121752041
chameleon
2005-07-19 09:47
2005.09.04
Почему не для всех структур нужно указывать размер ?


4-1121004521
Buggy
2005-07-10 18:08
2005.09.04
ничего не происходит при вызове GetOpenFileName(ofn)


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