Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизКак определить чего ты стоишь как программист. Найти похожие ветки
← →
geg © (2004-04-05 17:34) [0]Как узнать чего ты стоишь как программист. А то приходишь на собеседование и начинается. Прогоняют теорию. Черт, а я ее уже и не помню.. Ну практик я и что.. Дайте время разберусь.. Один хр..н все сам разбирал.. Тот же SQL сейчас сижу и разбираюсь по тому что нужно. Я считаю нет такой задачи которой не смог бы решить.. просто на каждую задачу понадобиться определенной время. Работодатели обычно нужно что бы они взяли и человек сразу сел и начал писать.. Но все равно в коллективе без притирки и принятии соглашений - нормальной работе нет и речи.. Первое время все равно нужно сидеть и разбирается что да как. Так вот Люди которые причастны к принятию решений о брать или на брать на работу (ели здесь есть такие) посоветуйте как вести разговор и что нужно знать в обязательном порядке при походе на разговор с работодателем.
Заранее благодарен.
← →
serge35 (2004-04-05 17:45) [1]Поищи работу подешевле.
Там не так придираются...
← →
Юрий Зотов © (2004-04-05 17:46) [2]> посоветуйте как вести разговор и что нужно знать в
> обязательном порядке при походе на разговор с работодателем
В обязательном порядке нужно знать то, что требуется для той работы, на которую Вас берет работодатель. И на том уровне, на котором это требуется.
Кстати, этот уровень совсем не обязательно должен быть высоким. Довольно часто набирают людей для простой рутинной работы, а брать на нее высококвалифицированного спеца невыгодно.
У нас при приеме предлагаются 2 теста - по Delphi и Interbase. Еще ни один человек полностью на все вопросы не ответил - но это вовсе не значит, что мы никого не взяли. Люди нужны разные.
← →
Игорь Шевченко © (2004-04-05 17:52) [3]
> Как узнать чего ты стоишь как программист
Сходить на www.brainbench.com, например. Там есть бесплатные тесты.
Юрий Зотов © (05.04.04 17:46)
> 2 теста - по Delphi и Interbase.
Если тест по Delphi отличается от тех вопросов, что приводились в известной ветке, не поделишься ?
← →
pasha_golub © (2004-04-05 18:02) [4]Игорь Шевченко © (05.04.04 17:52) [3]
Угу, и мне интересны эти вопросы.
← →
Gero © (2004-04-05 18:10) [5]"способность построить иерархию классов с порядка 10 уровнями вложенности. И чтобы в этой иерархии был порядок, а не бардак
это самое главное" (c) Гаврила
http://delphimaster.net/view/14-1081088912/&web=1
← →
}|{yk © (2004-04-05 18:11) [6]Ха - у нас даются 2 теста - по Delphi и Oracle. Пришел я - ни разу не писал на Delphi (до прошлой осени писал на С++Builder) и с ораклом не очень (юзал Interbase). Но знание VCL и SQL помогло.
Так что нужно уметь программировать, а на чем - неважно.
← →
Nikolay M. © (2004-04-05 18:12) [7]
> посоветуйте как вести разговор и что нужно знать в обязательном
> порядке при походе на разговор с работодателем.
Имеется куча ФАКов даже на эту тему, поищи.
Для себя уже выработал несколько моментов, пока не подводили:
1) Самое главное - вести себя достойно, уверенно. Даже если ты не подойдешь просто по профилю, не исключено, что о тебе вспомнят через пару недель, если откроется твоя вакансия. А если твоими конкурентами будут студенты, то твоя задача - произвести впечатление профессионального, знающего, уверенного в себе человека. О том, чтобы это совпадало с действительностью, говорить не буду - это очевидно.
2) Не воспринимай работодателя как человека, который делает тебе огромное одолжение, беря к себе на работу и поэтому ты должен соглашаться на все его условия. Как правило, нормальная работа - это партнерство (я лично стараюсь быть оптимистом и не воспринимать работу на фирму как работу на "дядьку" или рабство). Ты тратишь на фирму свои силы и время, твоя компенсация за это - соответствующая твоему уровню зарплата, какие-то льготы, соц. пакет, обеды в офисе и тд. Не нужно предано смотреть в глаза работодателю "дяденька, возьмите меня".
3) Лучше заранее узнать профиль деятельности компании, в которую идешь на собеседование, поискать о ней отзывы в интернете и среди знакомых. Не исключено, что попадется такая фирма, в которой работать попросту противопоказано.
4) Подготовить краткий рассказ о себе в выгодном свете, его с тебя потребуют, а твое резюме не будут заучивать наизусть, лучше немного повториться: где, чему и как учился, последнее место работы, специализация, чем хотел бы заниматься (см. "профиль деятельности" из п.3 ;о ), каковы последние профессиональные достижения, если есть, то полученные сертификаты, иностранные языки, стажировки, курсы повышения квалификации и тп.
5) Морально быть готовым к тому, что велика вероятность того, что тебя не возьмут (претендентов много, место одно) и не расстраиваться по этому поводу. А так же к тому, что собеседование - всего лишь разговор двух умных людей и ни к чему никого не обязывает.
6) Банально, но тем не менее: быть вежливым. Бывает, что собеседник не вполне адекватный человек (читал, но сам не нарывался). Тогда, имхо, лучше просто прервать разговор, попрощаться и уйти.
По собеседованиям покатался достаточно, сам собеседовал тоже энное количество народа, так что все вышеозначенное взято из жизни, а не головы.
Успехов.
← →
Гаврила (2004-04-05 18:19) [8]>>Gero © (05.04.04 18:10) [5]
Да, чувствую мне эти 10 уровней еще долго припоминать будут :-)))
← →
Тимохов © (2004-04-05 18:22) [9]
> Гаврила (05.04.04 18:19) [8]
это точно.
я даже скопировал тот топик :))))))
← →
Desdechado © (2004-04-05 18:22) [10]Многие вещи не стоит говорить категорично, хоть ты можешь быть уверен на все 100, что это так. Лучше пусть будет твое имхо, но с готовыми аргументами. Тем более, не стоит охаивать или восхвалять то, о чем знаешь понаслышке. Это может просто быть признаком некомпетентности. А еще может пойти в разрез с мнением компании.
Сразу писать никто не начинает, именно для этого дается испытательный срок. Чтоб человек влился в коллектив, разобрался в предметной области, успел показать себя не с хорошей и плохой стороны как специалист и личность.
← →
Гаврила (2004-04-05 18:28) [11]И не стоит на собеседовании утверждать, что знаешь что-то, чего в действительности не знаешь. Обман всплывет достаточно быстро.
Лучше не пройти собеседование, чем быть уволенным через неделю работы
← →
Ega23 © (2004-04-05 18:30) [12]Короче, сходи в несколько мест, и сам поймёшь что говорить, я что не стоит. И как это говорить.
← →
Юрий Зотов © (2004-04-05 18:31) [13]> Игорь Шевченко © (05.04.04 17:52) [3]
> pasha_golub © (05.04.04 18:02) [4]
Это расширенный вариант. Добавлены одни вопросы (теперь их стало 20), уточнены формулировки других. Пока что ЛУЧШИЙ ответ был - 60 баллов из 100 возможных (если за каждый вопрос ставить оценку по 5-балльной системе).
Кстати, парень, который дал этот ответ, в программизме и в API - далеко не мальчик, это сразу чувствуется. Тем не менее - только 60 баллов из 100. Что, впрочем, совершенно не означает, что человек нам не подходит. Тест специально сделан с довольно высокой планкой сложности - тогда по ответам мы можем судить, КАКИМ именно образом и на КАКОЙ именно работе мы можем данного кандидата использовать. Если под него работа есть - милости просим, а дальше уже от него самого все зависит.
Могу выслать по мылу, но только НИ В КОЕМ СЛУЧАЕ не для публикования (даже в измененном виде). Иначе меня даже не уволят а просто сразу убьют. Причем два раза. :о)
← →
Юрий Зотов © (2004-04-05 18:32) [14]> Тимохов © (05.04.04 18:22) [9]
> я даже скопировал тот топик :))))))
И сохранил под именем "Гаврилиада"?
:о))))))
← →
Тимохов © (2004-04-05 18:34) [15]
> Юрий Зотов © (05.04.04 18:32) [14]
у меня тоже мыло есть.
обещаю, могила...
пожалуйста.
← →
Ega23 © (2004-04-05 18:36) [16]И мне! (подпрыгивая...)
И я хочу!
← →
Игорь Шевченко © (2004-04-05 18:38) [17]Юрий Зотов © (05.04.04 18:31)
По адресу в сообщении не трудно будет выслать ? Разумеется, на условиях полной конфиденциальности.
← →
Гаврила (2004-04-05 18:38) [18]>>Юрий Зотов © (05.04.04 18:32) [14]
И я хочу :-) Отправь и мне пожалуйста
← →
WebErr © (2004-04-05 18:39) [19]
> Юрий Зотов © (05.04.04 18:31) [13]
Кидай мне!
← →
}|{yk © (2004-04-05 18:40) [20]Юрий, а мне можно прислать? Я сравню с тем что у нас есть и посмотрю какой мой уровень, есть ли смысл ехать куда-то выше Харькова?
← →
Desdechado © (2004-04-05 18:44) [21]поправочка к [10]
... показать себя не только с хорошей, но и плохой стороны ...
Мы принимали людей, которые только микроконтроллеры программировали на асме, а через месяц они ваяли на Дельфи и еще через месяц на SQL. Но это нужен дар. Другие, бывает, все знают, но ничего не могут сами :(
← →
sniknik © (2004-04-05 18:47) [22]Юрий Зотов © (05.04.04 18:31) [13]
а мне можно? для личного использования (хочу попытатся ответить as is без подготовки)
интересуют в основном вопросы по Interbase (сам то я считаю что его почти не знаю, но вот судя по другим которые себе в анкете плюсик напротив него ставили..., знаю порядочно ;о)) но то у нас а как в другой серьезной фирме бы оценили хотелось бы знать.
и кстати сколько у вас времени дается на ответы?
← →
YurikGl © (2004-04-05 18:51) [23]А мне не нужно, все равно не пройду. :)
← →
Тимохов © (2004-04-05 18:52) [24]Есть ощущение, что Юрий не решится прислать секретный тест такому моличеству народа :((((((((
← →
Sergey_Masloff (2004-04-05 19:19) [25]Тимохов © (05.04.04 18:52) [24]
>Есть ощущение, что Юрий не решится прислать секретный тест >такому моличеству народа :((((((((
И правильно сделает ;-)
А на что он тебе? (ну не тебе лично а вообще). Меряться с самим собой?
Предыдущий вариант Юрий приводил, меня лично он не впечетлил но это зависит от специфики конторы. По крайней мере из того теста значительную часть я знал но никак не пойму как на основании этих вопросов можно судить о пригодности человека. Хотя наверное (и даже наверняка) это специфика организации.
← →
pasha_golub © (2004-04-05 19:57) [26]2Юрий Зотов
Был бы очень признателен. Мыло в анкете верное. Ничего никогда никому. Обещаю.
← →
тихий вовочка © (2004-04-05 20:50) [27]Во-во, и я бы потестировался. А то уже полгода не могу найти работу даже на 250 уев. Хотя опыт работы 3 года и много чего писал и на Delphi и на C++Builder. С горя уже пробуюсь в тех. поддержку. И то не берут! Осталось в сборщики податься. Вобщем полная фрустрация, мля
← →
Aldor © (2004-04-05 20:52) [28]Юрий, был бы безмерно благодарен. Очень полезно будет. Обязуюсь не публиковать, тем более что живем мы даже в разных странах :)
← →
Nous Mellon © (2004-04-05 21:08) [29]Юрий честное слово, никому не скажу.. очень интересен тест по Делфи
Если будет возможность пожалуйста пришлите e-mail в посте.
Был бы очень благодарен.
← →
Sergey Masloff (2004-04-05 22:22) [30]А кстати ответ на первоначальный вопрос очень прост - достаточно в конце месяца посмотреть в зарплатную ведомость. Практика, как говорится, критерий истины ;-)
← →
Кулясов © (2004-04-05 22:27) [31]>очень интересен тест по Делфи
Хорошо бы всё таки опубликовать в Интернете.
← →
Pat © (2004-04-05 22:53) [32]>Хорошо бы всё таки опубликовать в Интернете.
Навалом...
Правда более-менее путевый только на brainbench.com (для D3 бесплатный, кажется)
← →
Sergey Masloff (2004-04-05 23:04) [33]Pat © (05.04.04 22:53) [32]
>Правда более-менее путевый только на brainbench.com
Полное г... Это я тебе как master delphi programmer (по версии брайнбенч) говорю.
← →
Rouse_ © (2004-04-05 23:13) [34]:))))
Судя по обилию запросов - Юрию будет намного проще либо выложить их здесь, либо сказать категоричное нет :))
← →
VID © (2004-04-06 00:16) [35]2 Юрий Зотов: я тоже хочу... vid@endimus.ru
← →
konstantinov © (2004-04-06 00:24) [36]М-да! Очень хотелось бы попробовать тест Юрия...
Боюсь, что мне не достанется... :((
← →
VMcL © (2004-04-06 00:49) [37]По subj"у:
>Как узнать, чего ты стоИшь, как программист?
Вот и я думаю, ну чего стоять, как программист, а не как другие люди.
← →
Юрий Зотов © (2004-04-06 03:01) [38]Да... как много желающих моей смерти, оказывается... :о)
Во, блин, попал... И выслать всем, конечно, не могу и не выслать тоже не хочется. Придется принимать компромиссное решение.
Для желающих "самопротестироваться" воспроизвожу (в слегка измененном виде) ветку, которая когда-то давно здесь уже была. Для самотеста этих 12 вопросов, честное слово, вполне достаточно.
===========================================================
На все вопросы отвечать без машины, книг и справки. Можно пользоваться лишь бумагой и ручкой. Если не помните наизусть количество параметров в функциях, их тип и порядок следования - это неважно, достаточно указать лишь схему вызова - например, так: MyFunc(...). Ответы нужны короткие, но точные - то есть, лишь самая суть в одной-двух фразах. Общее время на все - примерно час.
Имейте в виду, что большинство приводимых ниже вопросов, IMHO, в общем-то, все же выше среднего уровня прикладного программиста. Так что, если на что-то не ответите, то это вовсе не повод не для расстройства. Думаю, даже если ответите на половину, то это уже будет совсем неплохо. А если на все - то Ваш уровень явно выше среднего.
1. Знание основ и платформы.
1.1. Чему будет равно W после выполнения следующего кода 32-битным процессором семейства x86? Ответ объяснить.
type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;
2. Знание языка, общее умение программировать и грамотность стиля.
2.1. Написать процедуру поиска в заданном каталоге и всех его подкаталогах всех файлов по маске A?.B* (контрольное время - 20 минут).
3. Знание и понимание VCL.
3.1. В чем принципиальное различие между классами TLabel и TStaticText?
3.2. От какого класса наследуется класс TCollection и почему?
3.3. У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?
3.4. Написать модуль, содержащий класс, который позволяет создать только единственный экземпляр объекта этого класса (контрольное время - 10 минут).
4. Знание основ Win32 и его API.
4.1. Что такое объекты ядра? Перечислите несколько функций, в которых они используются.
4.2. Приводят ли вызовы функций LoadLibrary/FreeLibrary к загрузке/выгрузке DLL в/из ОЗУ?
4.3. Написать стандартный код цикла выборки сообщений (контрольное время - 2 минуты).
4.4. Чем отличаются друг от друга функции SendMessage и PostMessage?
4.5. Как послать сообщение в безоконное приложение и как его там принять?
4.6. Каково назначение функций GetStockObject и SelectObject? Нужно ли после их вызова вызывать функцию DeleteObject?
← →
Alex Konshin © (2004-04-06 03:17) [39]Ну все...
Теперь со шпаргалками на интервью приходить будут. :)
А ответ на 1.1 неоднозначен, указания того, что используется 32битный процесор недостаточно, нужно еще указать, что используется Delphi2 и выше. Надеюсь, вы понимаете, о чем я.
← →
Юрий Зотов © (2004-04-06 03:45) [40]> Alex Konshin © (06.04.04 03:17) [39]
Подразумевается, что код его родной, никаких там санок и виртуальных машин. Хотя можно было бы и правда указать.
← →
Германн © (2004-04-06 03:45) [41]2 Alex Konshin © (06.04.04 03:17) [39]
>Ну все...
>Теперь со шпаргалками на интервью приходить будут. :)
Только где найти материал для сих шпаргалок? Или где найти того, кто их напишет?
Только не я. Если я смогу, то может быть отвечу на ~20% вопросов. И то в лучшем случае. :(((
← →
Alex Konshin © (2004-04-06 03:49) [42]Я вообще-то про то, что тип integer разный в Delphi и Delphi2.
← →
Юрий Зотов © (2004-04-06 03:59) [43]> Alex Konshin © (06.04.04 03:49) [42]
Дык... и я, вроде как, о том же.
← →
geg © (2004-04-06 09:07) [44]Мда все конечно хорошо но как всегда свелось к банальным вопросом (выпрашивания). А идея заключалась чтоб знающие люди поделились опытом.
Единственный человек попытавшийся помочь Юрий Зотов , уму огромное спасибо.
Но хотелось бы услышать мнение и других людей.
← →
Layner © (2004-04-06 09:16) [45]Обычно, если есть у тебя сайт с твоими программами, дай ссылку и все. Если они сочтут нужным, сами тебя найдут, если нет... то и нет...
← →
serge35 (2004-04-06 10:55) [46]Не знаю практически ни одного ответа.
Но знаю как свести дебет с кредитом в оборотном балансе и мне этого хватит до пенсии.
← →
Игорь Шевченко © (2004-04-06 11:12) [47]Sergey Masloff (05.04.04 23:04)
> Полное г... Это я тебе как master delphi programmer (по
> версии брайнбенч) говорю.
Дело в том, что в какое-то время у них вопросы здорово поменялись. У нас в 1999-м, начале 2000-го было почти поголовное тестирование, master programmer нахватали многие, а потом подтвердить это звание было гораздо сложнее.
← →
Algol (2004-04-06 11:41) [48]
> Юрий Зотов
По правде говоря этот тест тестирует все что угодно, кроме умени мыслить... А именно этого и не хватает 90% программистов...ИМХО
← →
Сергей Суровцев © (2004-04-06 11:41) [49]>Юрий Зотов © (06.04.04 03:01) [38]
>Да... как много желающих моей смерти, оказывается... :о)
Вряд ли, но, видимо, уж больно хочется глянуть, как это получится два раза... :))
← →
Vitaly © (2004-04-06 11:54) [50]> Alex Konshin © (06.04.04 03:49) [42]
> Я вообще-то про то, что тип integer разный в Delphi и Delphi2.
В смысле - размер?
← →
data © (2004-04-06 11:59) [51]2 ЮЗ
Юрий, спасибо большое за тесты. Я скопировала, и мы всем отделом немного поразвлекались:)) Честно скажу, что на все вопросы никто не ответил, это во многом зависило от специфики работы человека -кто из нас с чем восновном работает. Про себя скажу, что затруднения вызвали ответы на 4.3, 4.5 и 4.6, т.к с чистым апи я действительно не оч. много работаю:(.
А на 3.2 и 3.3 ответы есть, но мы к сожалению не знаем, насколько они правильные :))))
← →
sniknik © (2004-04-06 11:59) [52]geg © (06.04.04 09:07) [44]
> А идея заключалась чтоб знающие люди поделились опытом.
могу рассказать как вести себя не надо.
присутствовал при собеседовании когда у нас программиста брали, на с++ (основное требование), специализация драйвера устройств, и желательное знание COM в формате под 1С(они там извратили немного...;), или хотябы просто знание COM).
пришла одна девица, резюме ... ммм ... пальчики оближеш, я столько умных слов не знаю в скольких темах (по резюме) она разбирается.
но вот когда начали говорить (я просто присутствовал) оказалось что знания мягко говоря не соответствуют действительности, так из высказываний
- "вот вы тут указали знание ASM, у вас есть программы написанные на нем? можете привести отрывок кода, или написать?"
- "эээ., нет.."
- "но вы указали что знаете"
- "ну нам на лекциях давали..." (тут надо сказать все присутствуюшие чуть со стульев не попадали от сдерживаемиго смеха, собеседователю пришлось труднее всего он сидел к ней лицом :), это ж надо не написать ни строчки кода и быть уверенным что знаеш...)
та же ситуация оказалась с "явоскриптом" только тут девица порывалась чтото написать/показать (лутше бы не пыталась)
некоторое время в ступоре смотрера на комп, после выдала
- "а у нас тут кнопочка была" (в главном меню) "на нее надо было нажать и пишеш"...
даже мне не знакомому с JavaScript ясно (ну пользовались они какойто программой облегчающей написание) но можно ведь просто в блокноте набить или отредактировать любой html файл и написать свой скрипт.
знание html кстати тоже было заявлено, но не было понимания простейщего того что это просто текст пусть с разметкой...
ну и т.д.
у меня кстати впечатление сложилось что первый ответ все решил, дальнейшее "собеседование" велось просто ради прикола, и даже если бы она чтото знала...
а ведь ASM не фигурировал даже в дополнительных требованиях.
кстати взяли парня который просто пришол "посмотреть" не надеясь особо, т.к. по требованиям не подходил, ни драйвера ни ком обьекты не писал, указал единственное - знание с++ и протоколола tcp/ip. но вел себя не как на экзамене, при разговоре о протоколе сказал что есть программа написаная. (довольно серьезная, но абсолютно бесполезная для нас)
с ним просто поговорили, на программу сказали охота бы взглянуть, ну и если не найдем никого то ему позвонят, или зайди если будет время через 2 недели. никого не нашли.
он оказался лутший кандидат. ;о) (подтверждается, драйвера уже пишет, по ком пока не нужно)
← →
Юрий Зотов © (2004-04-06 12:03) [53]> Algol (06.04.04 11:41) [48]
> этот тест тестирует все что угодно, кроме умени мыслить
1. Могу Вам практически гарантировать, что человек, правильно, четко и коротко ответивший даже на половину вопросов мыслить уж точно умеет. Иначе бы он до этого уровня никогда не дошел.
2. Попробуйте ответить на вопросы 1.1, 3.3 и 3.4, пользуясь ТОЛЬКО знаниями и НЕ пользуясь специфическим "программистским" мышлением (правда, как его "отключить" - я не знаю).
3. Никакими тестами и ни на каком собеседовании выяснить пригодность кандидата на все 100% невозможно. Поэтому и существует испытательный срок.
← →
LaidBack (2004-04-06 12:17) [54]Даже сейчас не скажу, чем отличается TStaticLabel от TLabel, т.к. в моей творческой деятельности его никогда не использовал. Тем не менее это не помешало мне написать 3 коммерчески успешных VCL-библиотек и множество программ. Так что не все тесты одинаково полезны для здоровья.
← →
Rule © (2004-04-06 12:25) [55]НУ ДОПУСТИП Я НА 50 ПРОЦЕНТОВ БЫ ОТВЕТИЛ, НО А ЕСЛИ БЫ НЕ ОТВЕТИЛ, ЧТО ЧТО, РАЗВЕ Я НЕ ПРОГРАММИСТ, Я ТОЧНО ЗНАЮ ТОЛЬКО ТО, С ЧЕМ СТАЛКИВАЛСЯ, ТАК ЧТО Я СЧИТАЮ ЭТИМ ТЕСТОМ ПРОВЕРЯЕТСЯ ОПЫТНОСТЬ И ЧЕМ БОЛЕЕ РАЗНОРОДНЫЕ ВОПРОСЫ ТЕМ БОЛЕЕ ПРОФЕССИОНАЛЬНЫЙ И ВСЕЗНАЮЩИЙ ПРОГРАММИСТ ДАС НА НИХ ОТВЕТ, ПО МОЕМУ ОСНОВНОЙ КРИТЕРИЙ - ЭТО ЗНАНИЕ ОСНОВ, И СПОСОБНОСТЬ А ГЛАВНОЕ ЖЕЛАНИЕ ОБУЧАТСЯ, ЕСЛИ ЭТОГО ЕСТЬ ТО ЛЮБАЯ ТЕХНОЛОГИЯ ПО ПЛЕЧУ
← →
serge35 (2004-04-06 12:26) [56]Чтобы узнать чего ты стоишь как программист, надо вспомнить все программы, которые ты сделал, как они работают, нужны ли они людям и тогда станет ясно чего ты стоишь.
Можно быть величайшим теоретиком, только пользы от этого никакой.
← →
Algol (2004-04-06 13:17) [57]
> Юрий Зотов © (06.04.04 12:03) [53]
Конечно чисто технарская проверка нужна. Но все же программирование - смесь науки и искусства.
Умение абстрактно мыслить, например, намного важнее чем занние отличия "функции SendMessage и PostMessage", которое легко можно посмотреть в хелпе (который для этого и существует).
В общем, я просто хочу сказать, что никакие тесты не могут проверить пригодность к программированию.
← →
serge35 (2004-04-06 13:23) [58]В 99% случаев заказчику наплевать, на каких функциях и классах посторена система. Ему нужен реально работающий проект, соответствующий его требованиям.
А если сказать заказчику, что его требование не вписывается
в рамки теории, то он просто найдет другого исполнителя и все.
← →
вразлет © (2004-04-06 13:35) [59]Ю.З.
ИМХО, вопросы, которые Вы привели, нацелены на отсев кандидатов слабо владеющими навыками программирования в Win, но никак не на оценку программисткой мысли (если хотите жилки). Допускаю, что звезда форума <........... О.> более менее внятно ответил бы на них, но это ли Вам надо?
← →
Algol (2004-04-06 13:35) [60]
> А если сказать заказчику, что его требование не вписывается
>
> в рамки теории, то он просто найдет другого исполнителя
> и все.
Практика показывает, что если программа "не вписывается
в рамки теории", то заказчик потом потреяет еще больше времени и денег на ее замены/апдейты/переписывания/мудоханья и т.д. ))
К сожалению, не все заказчики это понимают...
← →
Юрий Зотов © (2004-04-06 13:37) [61]> Algol (06.04.04 13:17) [57]
> Умение абстрактно мыслить, например, намного важнее чем
> занние отличия "функции SendMessage и PostMessage"
Скажите, Вы ВНИМАТЕЛЬНО читали [53]? В частности, п.1?
> В общем, я просто хочу сказать, что никакие тесты не могут
> проверить пригодность к программированию.
Скажите, Вы ВНИМАТЕЛЬНО читали [53]? В частности, п.п.1 и 3?
← →
Юрий Зотов © (2004-04-06 13:45) [62]> вразлет © (06.04.04 13:35) [59]
Cм. [53].
Если человек сумел дойти до определенного уровня - можете не сомневаться, что и с "жилкой", и с "мышлением" у него все в порядке.
Что касается "звезд" - ну не будем смешить друг друга, лады?
:о)
← →
Игорь Шевченко © (2004-04-06 13:53) [63]Юрий Зотов © (06.04.04 13:45)
Спасибо еще раз. Один вопрос я честно не знаю, в двух других сомневаюсь :)
← →
вразлет © (2004-04-06 13:56) [64]Юрий Зотов©
Если человек сумел дойти до определенного уровня - можете не сомневаться, что и с "жилкой", и с "мышлением" у него все в порядке.
И все же, я сомневаюсь, и считаю, что функции "созидания" и "усваивания" суть разные вещи, тем более, что приведенные вопросы относительно поверхностны, и рано или поздно с ними сталкивается любой программист Win
Что касается "звезд" - ну не будем смешить друг друга, лады?
:о)
Этой фразы я не понял, можете прояснить?
← →
Algol (2004-04-06 14:01) [65]
> Скажите, Вы ВНИМАТЕЛЬНО читали [53]? В частности, п.1?
Читал. Не согласен :)
← →
Vuk © (2004-04-06 14:03) [66]to Юрий Зотов © (06.04.04 13:45) [62]:
А можно и мне посмотреть? Интересно, аж жуть... :o)
← →
Карелин Артем © (2004-04-06 14:17) [67]Ради интереса отвечаю. Поправьте где не прав и вынесите решение:
1.1 Какое начальное значение I? High(I) shr 8 даст нам 0 и W := PWord(Integer(@I) + 2)^; даст нам 2 байта из этого нуля, т.е. 0... Непонятно в чем прикол. Или сдвиг вправо даст единицы?
2.1 TSearchRec, FindFirst, FindNext, FindClose// Если бы под руками была шпора, написал бы за пару минут.
3.1,3.2 Эээээээээээээээ........... В 3.1 вроде как у статика эконного хэндла нет....
3.3. У форм и модулей. Почему не интересовался. А зачем?
3.4. Можно мьютекс забабахать в конструктор. А можно статью глянуть на Королевстве.
4.1 мьютексы, потоки и критические секции?
4.2 Нет наверно.
4.3 Зачем писать, когда в исходниках TApplication и TThread это есть? Copy-paste есть.
4.4 Ну это... Один принимает, другой посылает.
4.5 Ну наверно посылать надо хэндлу приложения, а не окна. Application.handle, хотя для этого я использую возможности IP.
4.6 Я в первой про них слышу, но наверно DeleteObject надо вызывать после Create*Object, а не Get*Object.
← →
Юрий Зотов © (2004-04-06 14:23) [68]> вразлет © (06.04.04 13:56) [64]
> И все же, я сомневаюсь, и считаю, что функции "созидания"
> и "усваивания" суть разные вещи
Разные, конечно. Но повторюсь - если человек уже дошел ло определенного уровня, то как программист он УЖЕ состоялся - а тогда за его "созидательную" функцию можно не волноваться. Как и за "мышление" и пр. Они УЖЕ доказаны самим фактом.
> приведенные вопросы относительно поверхностны, и рано или
> поздно с ними сталкивается любой программист Win
Естественно, сталкивается. Тест как раз и выясняет - что именно для него еще "рано, а что уже "созрел".
Что же касается поверхностности вопросов - попробуйте ответить на них сами (только ПОЛНОСТЬЮ, включая все "объяснить" и "почему"). Можно на бумаге, а если хотите - то прямо здесь. Все увидите сами. Тогда и насчет "звезд" станет ясно, что же имелось в виду.
> All
Мнения и критика действительно интересны и полезны - но, согласитесь, только в том случае, когда они компетентны. Поэтому есть просьба - прежде чем высказываться по поводу теста, сначала пройти его самому (ответы можно приводить прямо здесь, все равно они уже когда-то обсуждались).
Во-первых, это поможет понять истинную суть вопросов (то есть, то, что они на самом деле проверяют) - а в результате Ваше мнение может измениться и диалог будет более конструктивным. Во-вторых - если будет допущено более... ну, скажем, двух ошибок - сорри и увы, но делайте выводы.
← →
вразлет © (2004-04-06 14:31) [69]Написать стандартный код цикла выборки сообщений (контрольное время - 2 минуты).
GetMessage
PeekMessage
DispatchMessage
Чем отличаются друг от друга функции SendMessage и PostMessage?
SendMessage ждет обработки отправленного сообщения, PeekMessage -не ждет
← →
data © (2004-04-06 14:33) [70]Карелин Артем © (06.04.04 14:17) [67]
>1.1 Какое начальное значение I? High(I) shr 8 даст нам 0 и W := >PWord(Integer(@I) + 2)^; даст нам 2 байта из этого нуля, т.е. >0... Непонятно в чем прикол. Или сдвиг вправо даст единицы?
имхо, тут без разницы какое начальное значение i. ф-ия High() для порядковых типов дает максимальное значение данного типа, т.е. число 0111....111 - всего 32 разряда (первый-знаковый).
Сдвиг на 8 вправо дает число 0111....111 - всего 24 разряда. А последующая операция со сдвигом указателя на 2 байта откидыват еще 16 разрядов справа, от начала числа. Таким образом получается 0111 1111, т.е. =127
← →
Юрий Зотов © (2004-04-06 14:33) [71]> Карелин Артем © (06.04.04 14:17) [67]
> Поправьте где не прав и вынесите решение
Чтобы не публиковать ответы раньше времени (кто-то ведь, наверное, еще хочет и сам ответить), просто проставлю значки: плюс - верно, минус - неверно, звездочка - частично верно.
1.1 -
2.1 -
3.1 +
3.2 -
3.3 *
3.4 -
4.1 *
4.2 *
4.3 -
4.4 -
4.5 -
4.6 -
← →
вразлет © (2004-04-06 14:33) [72]type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;
К сжалению синтаксис Делфи не помню, но на С ответил бы
← →
вразлет © (2004-04-06 14:35) [73]VCL-тут ничего сказать не могу, ну не помню Делфи
← →
data © (2004-04-06 14:38) [74]а поправьте кто-нить правильно ли я думаю по поводу 3.3:
мне кажется это визуальные компоненты, которые могут являться owner и parent для других компонентов.
← →
Юрий Зотов © (2004-04-06 14:40) [75]> data © (06.04.04 14:33) [70]
Ответ не совсем полный. В вопросе не зря упоминается x86.
← →
Юрий Зотов © (2004-04-06 14:44) [76]> вразлет © (06.04.04 14:33) [72]
> синтаксис Делфи не помню
> вразлет © (06.04.04 14:35) [73]
> VCL-тут ничего сказать не могу, ну не помню Делфи
Извините, но тогда я не понимаю - как же можно судить о том, поверхностные это вопросы, или нет, если это не Ваша область?
← →
data © (2004-04-06 14:44) [77]2 Юрий Зотов © (06.04.04 14:40) [75]
ах, да: если я не ошибаюсь, то от семейства процессора зависит младший или старший байт лежит по адресу указателя на число, у x86 младший. Старший по-моему у каких-то мотороловских. но могу и ошибаться.
← →
Юрий Зотов © (2004-04-06 14:47) [78]> data © (06.04.04 14:38) [74]
Увы, неверно в принципе. :-(
← →
Cobalt © (2004-04-06 14:50) [79]Интересно, а так?
Ответит кто-нибудь с полным циклом размышления?
type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) - 2)^;
end;
Для меня, например, это такая абстракция :-(
Не вижу практического применения, кроме как в ассемблере...
← →
Матлабист (2004-04-06 14:52) [80]> Прогоняют теорию. Черт, а я ее уже и не помню..
Практику за пять минут можно посмотреть в F1. Практический вопрос это вроде пятый параметр CreateFile ?
> Я считаю нет такой задачи которой не смог бы решить..
Учите матчасть. Такие задачи есть. Называется алгоритмически неразрешимая проблема.
просто
>Работодатели обычно нужно что бы они взяли и человек сразу сел и начал
> писать..
Далеко не всегда... Даже скорее всего не всегда...
>Так вот люди которые причастны к принятию решений о брать или на
> брать на работу (ели здесь есть такие) посоветуйте как
> вести разговор и что нужно знать в обязательном порядке
> при походе на разговор с работодателем.
Почитай Дж. Спольски. Характер вопросов может варьироваться от того, какой человек нужен. Теоретически подкованный человек имеет больший рессурс, что ли... Потому как теория одна, а практика это но 80% приложения теории. Лучше знать теорию и в случае необходимости приспособить ее под определенные нужды, чем придумывать что-то свое... Знание теории подразумевает изучение литературы, широту интересов...
Есть еще личностные качества. Которые можно определить по манере собеседования, по характеру написания исходников, ...
Поэтому вопросы должны быть самые разные.
А вести себя надо достойно и честно.
← →
вразлет © (2004-04-06 14:53) [81]data ©
в х86 сначала младший потом страший
← →
data © (2004-04-06 14:54) [82]вразлет © (06.04.04 14:53) [81]
я так и написала
← →
MBo © (2004-04-06 14:55) [83][71]
3.1 -
Смысл уловлен правильно, но ответ инверсный ;)
← →
вразлет © (2004-04-06 14:56) [84]Сдвиг на 8 вправо дает число 0111....111 - всего 24 разряда. А последующая операция со сдвигом указателя на 2 байта
Не знаю как в делфи, а в С это сдвиг указателя на 2*размер unteger
← →
вразлет © (2004-04-06 14:56) [85]integer
← →
вразлет © (2004-04-06 14:57) [86]data ©
я так и написала
виноват, мне показалось
← →
data © (2004-04-06 14:58) [87]в дельфи на 2 байта должно быть, сейчас проверю..
← →
вразлет © (2004-04-06 15:00) [88]Юрий Зотов © (06.04.04 14:44)
Извините, но тогда я не понимаю - как же можно судить о том, поверхностные это вопросы, или нет, если это не Ваша область??
Да, это не моя область, но тем не менее, со многими из вопросов мне пришлось столкнуться
← →
nikkie © (2004-04-06 15:01) [89]>Не знаю как в делфи, а в С это сдвиг указателя на 2*размер unteger
если не производить преобразование указателя к integer
← →
data © (2004-04-06 15:01) [90]не, операция W := PWord(Integer(@I) + 2)^; сдвигает на 2 байта (в дельфи), проверила, получилось 127, как и ожидалось теоритически:)))
← →
Юрий Зотов © (2004-04-06 15:03) [91]> MBo © (06.04.04 14:55) [83]
Точно! Это уже мне минус - за невнимательность. :о)
← →
вразлет © (2004-04-06 15:03) [92]nikkie ©
Я же вслепую, даже не знаю, как обозначается операции извлечения адреса и извлечения данных по указателю)
← →
Vuk © (2004-04-06 15:05) [93]to Карелин Артем:
>3.4. Можно мьютекс забабахать в конструктор. А можно статью
>глянуть на Королевстве.
Mutex - это не интересно. Есть способ более изящный. По большому счету, это вопрос на знание RTL. Кстати, если не ошибаюсь, мы этот способ с Юрием как-то, давно еще, задолго до первого тура ответов на эти вопросы, здесь обсуждали. :o)
to Юрий Зотов:
Вообще говоря, я уже на эти вопросы пытался для себя ответить еще в самый первый раз. Честно завалился на первом. C поиском файлов затруднения только в том, что не особо часто приходится этим пользоваться, и многое просто не помнится, принцип же и средства понятны. Остальное, по большей части, каких-либо вопросов не вызвало, кроме OnCreate, над которым пришлось тогда малость подумать.
← →
data © (2004-04-06 15:05) [94]2 ALL
меня очень вопросы 3.2 и 3.3 продолжают интересовать:
как выяснилось, про 3.3 я в принципе ошибалась:(
а 3.2 кажется, что здесь дело в методе Assign у TPersistent, но не уверена. Может у кого есть еще варианты?
← →
вразлет © (2004-04-06 15:11) [95]1.1
Ответ 65535?
← →
вразлет © (2004-04-06 15:13) [96]то есть 255
← →
Юрий Зотов © (2004-04-06 15:13) [97]> вразлет © (06.04.04 15:00) [88]
> Да, это не моя область, но тем не менее, со многими из
> вопросов мне пришлось столкнуться
И о чем же это говорит? Ровно ни о чем. Мне вот пришлось столкнуться с квартирным вопросом - толку ноль.
Уверяю Вас, что на эти вопросы (которые Вы сочли поверхностными) правильно и полностью здесь ответят совсем немногие (если вообще не единицы). Что само по себе совсем не страшно (см.[13], второй абзац). Тест как раз и составлен с расчетом на то, чтобы выяснить уровень кандидата (который говорит о его опыте, зрелости, мышлении и т.п.) и наилучшую область его использования в команде. Если такой человек нужен - он проходит.
← →
data © (2004-04-06 15:16) [98]2 вразлет © (06.04.04 15:13) [96]
127
← →
вразлет © (2004-04-06 15:19) [99]Ну если знаю их поскольку постольку, то человек, который работает в этой области должен их щелкат, как орешки, это же Азы вин програмиирования без них вообще никак!
← →
вразлет © (2004-04-06 15:21) [100]data ©
Где ты взяла старший 0?
← →
MBo © (2004-04-06 15:22) [101]>data © (06.04.04 15:05) [94]
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=215
← →
Матлабист (2004-04-06 15:23) [102]Примено так (без F1 и Delphi)
1.1.
High(I) = $7FFF FFFF
High(I) shr 8 = $007F FFFF
Ответ: $007F
2.1.
procedure PrintFolder(const Name, Mask: string);
var
SR: TSearchRec;
begin
FindFirst(Name + "\" + Mask, SR, faAnyFile);
repeat
if SR.Name = "." then Continue;
if SR.Name = ".." then Continue;
WriteLn(Name + "\" + SR.Name);
if SR.Attribute or faDirectory
then PrintFolder(Name + "\" + SR.Name + Mask);
until False;
end;
begin
PrintFolder("C:\", "A?.B*");
end.
3.1. При клике на TLabel активизируется ассоциированный с ним контрол. TStaticText просто отображает информацию. Скорее всего у них даже наследники разные --- TStaticText должен по идее не содержать Handle а рисоваться на канвасе формы.
3.2. От какого класса наследуется класс TCollection и почему?
Скорее всего TPersistent, чтобі иметь возможность быть записанной в поток. Хотя для записи коллекций используются независимые и встроенные от TPersistent механизмы.
3.3. У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?
Не знаю. Догадка -- у контейнеров других компонентов. Чтобы проинициализировать все элементы...
3.4. Написать модуль, содержащий класс, который позволяет создать только единственный экземпляр объекта этого класса (контрольное время - 10 минут).
Если по памяти, то перекрыть GetInstance... Вот только без помощи трудно это сделать... План примерно такой:
type
TSingleton = class(TObject)
function GetInstance: Pointer; override;
end;
var
SingleClass: TSignleton;
function TSingleton.GetInstance: Pointer;
begin
if Assigned(SingleClass) then
begin
Result := SingleClass;
Exit;
end;
Result := inherited GetInstance;
SingleClass := Result;
end;
// + синхронизация, если необходимо...
4. Знание основ Win32 и его API.
4.1. Что такое объекты ядра? Перечислите несколько функций, в которых они используются.
Объекты, которые принадлежат одинаково всем процессам (и к которым можно получить доступ из всех процессов). CreateMutex
4.2. Приводят ли вызовы функций LoadLibrary/FreeLibrary к загрузке/выгрузке DLL в/из ОЗУ?
Если счетчик ссылок этой DLL = 0 (и количество потоков и процессов, ее использующей), то да. DLL, загруженные по разным адресам, считать разными.
4.3. Написать стандартный код цикла выборки сообщений (контрольное время - 2 минуты).
var
Msg: _MESSAGE;
while GetMessage(Application.MainForm.Handle, Msg, 0, 0) <> 0 do
begin
TranslaceMessage // если есть акселераторы
DispatchMessage // если надо вызвать MainWndProc
end;
4.4. Чем отличаются друг от друга функции SendMessage и PostMessage?
В случае разных потоков SendMessage ждет окончания обработки сообщения (или вызова не помню какой функции), а PostMessage нет.
4.5. Как послать сообщение в безоконное приложение и как его там принять?
PostThreadMessage
GetThreadMessage / или GetMEssage(0, ...)
Надо уточнить.
4.6. Каково назначение функций GetStockObject и SelectObject? Нужно ли после их вызова вызывать функцию DeleteObject?
SelectObject нужен дл ятого, чтобы установить текущий элемент для рисования (стиль кисти, например). Нужно или нет надо смотреть в помощи... Уже не помню, но судя по логике нет. DeleteObjct должен соответствовать соответвующей Create-функции (например CreatePen). Возможно надо удалить, если мы выбираем текущую кисть, и потом не возвращаем старое значение... Тогда то старое надо удалить.
← →
data © (2004-04-06 15:23) [103]вразлет © (06.04.04 15:21) [100]
я же писала в [70] - это знаковый байт.
← →
data © (2004-04-06 15:24) [104]т.е бит:)))
← →
Юрий Зотов © (2004-04-06 15:29) [105]> вразлет © (06.04.04 15:19) [99]
> Это же Азы вин програмиирования
Если Вы говорите о разделе 4, то совершенно верно. Если же о других, то это скорее не Win, а Паскаль и VCL. И там есть вопросы, которые ДАЛЕКО не азы.
> без них вообще никак!
Если писать "на чистом API" - то да. Но Вы забываете, что речь идет о Delphi. А это RAD-среда, и VCL берет на себя многие тонкости API, позволяя ПРИКЛАДНОМУ программисту сосредоточиться на ПРИКЛАДНОЙ проблеме, а не на освобождении хэндлов - то есть, программировать, даже не зная толком, что такое ядро системы. Поэтому раздел 4 как раз и проверяет, знает ли человек основы Windows и API, способен ли он программировать "ручками", на чистом языке и без всяких VCL.
← →
Юрий Зотов © (2004-04-06 15:32) [106]> Матлабист (06.04.04 15:23) [102]
Оценки интересуют?
:о)
← →
Матлабист (2004-04-06 15:33) [107]Можно
← →
Матлабист (2004-04-06 15:37) [108]Только попутал порядок байт в первом --- они в обратной последовательности
← →
data © (2004-04-06 15:38) [109]>4.2. Приводят ли вызовы функций LoadLibrary/FreeLibrary к
>загрузке/выгрузке DLL в/из ОЗУ?
>Если счетчик ссылок этой DLL = 0 (и количество потоков и >процессов, ее использующей), то да. DLL, загруженные по разным >адресам, считать разными.
Мне кажется, загрузка происходит лишь частичная, т.е. при LoadLibrary загружается в память только ф-ция, которая отвечает за увеличение-уменьшение счетчика process attach, а другие ф-ции только метятся ссылками, но в реальную физическую память не грузятся. А собственно их подгрузка происходит уже при вызовах.
т.е. я бы ответила на вопрос "грузится частично".
← →
Algol (2004-04-06 15:39) [110]
> При клике на TLabel активизируется ассоциированный с ним
> контрол. TStaticText просто отображает информацию.
TLabel это TGraphicControl, а TStaticText это TWinControl , с всеми вытекающими ...
← →
вразлет © (2004-04-06 15:48) [111]Юрий Зотов ©
Наконец –то уловил Вашу мысль, и в значительной степени не могу не согласиться
← →
Игорь Шевченко © (2004-04-06 15:48) [112]:(
← →
Юрий Зотов © (2004-04-06 15:53) [113]> Матлабист (06.04.04 15:33) [107]
Пока без полных комментариев, чтобы сохранить интригу, ОК?
1.1 * (неполное объяснение)
2.1 * (искать будет, но совсем не так, как нужно)
3.1 - (просто неверно)
3.2 +
3.3 * (неточное объяснение)
3.4 * (идея не доведена до конца)
4.1 * (неточное объяснение)
4.2 + (с небольшой натяжкой)
4.3 +
4.4 + (с небольшой натяжкой)
4.5 + (с небольшой натяжкой)
4.6 * (ответ неполный и частично неверный)
IMHO, результат довольно высокий.
← →
Игорь Шевченко © (2004-04-06 15:55) [114]
> 2.1.
>
> procedure PrintFolder(const Name, Mask: string);
> var
> SR: TSearchRec;
> begin
> FindFirst(Name + "\" + Mask, SR, faAnyFile);
> repeat
> if SR.Name = "." then Continue;
> if SR.Name = ".." then Continue;
> WriteLn(Name + "\" + SR.Name);
> if SR.Attribute or faDirectory
> then PrintFolder(Name + "\" + SR.Name + Mask);
> until False;
> end;
А эта...FindNext ?
← →
Игорь Шевченко © (2004-04-06 15:58) [115]
> Догадка -- у контейнеров других компонентов
TPanel и TPageControl (например) являются контейнерами. У них нету события OnCreate :)
← →
Style © (2004-04-06 15:59) [116]3.1 - (просто неверно)
>>>Скорее всего у них даже наследники разные
2Ю.З.
А наследники что у них не разные??
Лейбл - это TGraphicsControl, а StaticText - TWinControl.
помоему даже в CreateWindow был тип такой - "Static"..
← →
Vuk © (2004-04-06 16:01) [117]Добавлю к
>У них нету события OnCreate
а если бы было, то...
Это подсказка такая. :o)
← →
Style © (2004-04-06 16:06) [118]2Vuk
то это было бы и не нужно :))
← →
Vuk © (2004-04-06 16:08) [119]to Style © (06.04.04 16:06) [118]:
>то это было бы и не нужно
Ну почему, я бы иной раз не отказался бы от такого события. Да вот не судьба... :o)
← →
Матлабист (2004-04-06 16:12) [120]
> А эта...FindNext ?
Забыл. Привык к циклам repeat until False, что не отвыкнешь... Правильно, конечно же FindNext(SR) <> 0. И FindClose тоже надо. Привык, что если что неправильно --- то при отладке всплывет... Вообще с листа писать довольно-таки неприятно...
IMHO, результат довольно высокий
В смысле взяли бы?
← →
Юрий Зотов © (2004-04-06 16:23) [121]> Матлабист (06.04.04 16:12) [120]
При наличии соответствующего объема работы и фонда зарплаты - вне сомнений.
← →
nikkie © (2004-04-06 16:26) [122]>[113]
>4.3 +
имхо, здесь * больше соответствует. поскольку
1. надо передавать 0, а не Application.MainForm.Handle
2. соответственно DispatchMessage вызовет не MainWndProc, а WndProc окна, которому адресовано сообщение
3. комментарий к TranslateMessage неверный - эта функция совсем не ради акселераторов.
← →
Style © (2004-04-06 16:28) [123]уж, хотел было сказать что какие проблемы, сделай компонент с OnCreate :))
И понял, что на момент создания компонента, у него не будут еще присвоены свойства и собственно адрес на процедуру обработки события OnCreate..
← →
Юрий Зотов © (2004-04-06 16:31) [124]> nikkie © (06.04.04 16:26) [122]
Согласен.
← →
Юрий Зотов © (2004-04-06 16:34) [125]> Style © (06.04.04 16:28) [123]
Теперь оценили всю глубину и красоту вопроса?
:о)
← →
Style © (2004-04-06 16:51) [126]Юрий Зотов ©
точно :)
← →
Nous Mellon © (2004-04-06 16:52) [127]
> [125] Юрий Зотов © (06.04.04 16:34)
Я, честно признаюсь, при ответе на вопрос 1 использовал WinCalculator.
Просто совершенно забыл правила перевода с\с. Выходит претендент должен всегда помнить эти правила? Если так пойду повторять :) На будущее :)
А может здесь возможно решение проще вообще исключающее како-либо перевод?
← →
Тимохов © (2004-04-06 16:55) [128]Юрию Зотову.
Классынй тест, чесное слово.
Мне было он дал хорошее представление о будущем работнике...
← →
Vuk © (2004-04-06 17:04) [129]to Style © (06.04.04 16:28) [123]:
>уж, хотел было сказать что какие проблемы, сделай компонент с
>OnCreate :))
У TFrame можно сделать. Даже работать будет. Иногда. :o)
← →
Piter © (2004-04-06 18:57) [130]а можно я свое ламерство продемонстрирую. Сейчас читаю вопросы ЮЗ, дальше постов не читал, чем у вас там все закончилось не знаю (постов, видимо, много), но думаю сильно не помешаю. Отвечать буду прям по тексту...
1.1. Чему будет равно W после выполнения следующего кода 32-битным процессором семейства x86? Ответ объяснить.
type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;
итак,I := High(I) shr 8;
High(i) - это максимальное число, представимое Integer"ом. Вот проблема - я его не помню.
Это 4-х байтовое целое знаковое. Сейчас воспользуюсь калькулятором...
256^4=4294967296, всего может быть столько вариантов. Одно значение под ноль отводим.
Остается 4294967295 вариантов. Делим пополам = 2147483647,5
не делится. Но если не изменяет память, под минус на одно значение больше отводится. Тогда получается Integer это от -2147483648 до 2147483647
Соответственно, High(i) это 2147483647, если ничего не напутал.shr 8;
хм. Меня терзают смутные сомнения, что я зря вычислял максимальное значение Integer числом.
Идет сдвиг на 8 бит вправо.
High(I) это будет, наверное, в HEX виде 7F FF FF FF
Сдвигаем на 8 бит вправо... 00 7F FF FF
Не знаю сколько это будет в числовом виде. Попробуем работать так...
Значит, I=$007FFFFF после первой строчки.
@I - это адрес по которому расположен байт 00
Хотя нет, стоп... числа хранятся наоборот, значит @I указывает в памяти на последний байт FF.
Integer(@I) - адрес представляется в виде числа... блин... я уже путаюсь...
хм, вроде понятно зачем перевели в Integer, чтобы 2 прибавить. Соответственно
Integer(@I) + 2 - это адрес байта FF плюс еще два...
PWord(Integer(@I) + 2) - приводят к типу указателя на Word. Ну и так было указателем, наверное, ничего не изменится. Но адрес теперь +2.... эээ... значит теперь адрес указывает на байт ... черт.. в общем, в памяти хранится такое:
FF FF 7F 00 - и указатель ссылается на этот жирный 7F... вроде так. А теперь разыменовывают. Ага, но тип Word - двухбайтовый. Значит, берутся байты 7F 00, а теперь наоборот в виде числа 00 7F. Черт, а я не знаю сколько это будет, что-то у меня мозги совсем одурели.
В общем, если принимается, то мой ответ W=$007F
> Написать процедуру поиска в заданном каталоге и всех его подкаталогах всех файлов по маске A?.B*
ну там FindFirst, FindNext... но без справки я не помню... это мне кажется нечестно. В таких случаях в справку можно смотреть.
>3.1. В чем принципиальное различие между классами TLabel и TStaticText?
А я TStaticText не использую блин... судя по названию... наверное, нельзя менять его значение в Run-Time... Вот и отличие :)
Ну и TLabel не окно, и TStaticText, наверняка не окно... Оба не оконные комппоненты, значит. Произошли не от TWinContrlol...
черт знает чем они там принципиально отличаются
> 3.2. От какого класса наследуется класс TCollection и почему?
черт, по-моему в ТП это было... может, от класса, который позволяет в потоки сохранять свойства... или как-то так. В общем, не знаю :(
> 3.3. У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?
Ну вот у формы есть... я думаю ответ на этот вопрос вытекает из вопроса "А зачем нужно событие OnCreate"... эх, не знаю
> .4. Написать модуль, содержащий класс, который позволяет создать только единственный экземпляр объекта этого класса
код писать не буду, не помню какие там параметры. Ну я думаю можно в конструкторе создавать мьютекс, если он уже существует - то в конструкторе возбуждать исключение, вот и все. А в деструкторе мьютекс закрывать. В общем, поступить как в случае, когда надо запускать только одну копию приложению.
Хотя может я задание неправильно понял...
> 4.1. Что такое объекты ядра? Перечислите несколько функций, в которых они используются.
Определение дать затрудняюсь. Ну вот эти мьютексы, семафоры, процессы, потоки являются объектами ядра.
ну и функцию соответствующие CreateProccess, CreateThread, TerminateProccess, CreateMutex и т.д.
> 4.3. Написать стандартный код цикла выборки сообщений
э-э-э... забыл, блин. Ну типа GetMessage, а потом не помню :(
> 4.4. Чем отличаются друг от друга функции SendMessage и PostMessage?
SendMessage посылает сообщение непосредственно оконной процедуре (через DispatchMessage что ли) и получает ответ. Ну а PostMessage просто кидает в очередь и тут же возвращает управление...
> 4.5. Как послать сообщение в безоконное приложение и как его там принять?
ух ты... а разве так можно... с другой стороны любое приложение будет иметь цикл выборки сообщений, на этом все и жиждится. Так и можно обрабатывать...
А вот как послать я не знаю Вроде SendMessage и PostMessage требуют handle окна...
> 4.6. Каково назначение функций GetStockObject и SelectObject? Нужно ли после их вызова вызывать функцию DeleteObject?
первый раз про такие функции слышу...
ДА.... в общем, я ламер, что и требовалось доказать... вот блин. Пойду читать остальные посты...
← →
Piter © (2004-04-06 19:22) [131]Ой, я забыл:
Юрий Зотов (06.04.04 03:01) [38]
4.2. Приводят ли вызовы функций LoadLibrary/FreeLibrary к загрузке/выгрузке DLL в/из ОЗУ?
если библиотеку больше никто не использует - то FreeLibrary приводит к выгрузке (это по вроде как по теории, на самом деле у меня твердая уверенность, что винда все там хитро кеширует, незря второй раз Дельфи грузится куда быстрее, чем первый)...
Ну а LoadLibrary приводит к загрузке библиотеки, если она еще на загружена другим процессом. Иначе просто проецируется на ВАП процесса...
← →
Тимохов © (2004-04-06 19:38) [132]Юрию Зотову.
Скажите, какой ответ вы бы хотели услышать на вопрос
"Напишите модуль, содержащий класс, который позволяет создать лишь один свой экземпляр."
Если я правильно понял вопрос решений то много...
Что вы считаете правильным?
← →
Игорь Шевченко © (2004-04-06 19:42) [133]
> Если я правильно понял вопрос решений то много...
Да вроде не очень много...
← →
Тимохов © (2004-04-06 19:46) [134]
> Игорь Шевченко © (06.04.04 19:42) [133]
Не понятно, что значит "позволяет": не дает делать вторую копию, или при создании второй копии подменяет ее первой.
Наверное, все-таки, первое. хотя не ясно.
От этого ответ зависит...
← →
Vuk © (2004-04-06 19:46) [135]to Тимохов © (06.04.04 19:38) [132]:
Не знаю, как Юрий, я обычно использую комбинацию близкую к той, что была здесь описана, с перекрытием метода NewInstance. В дополнение можно использовать специальную переменную экземпляра, которая нужна для того чтобы не допускать повторной инициализации в конструкторе. Ну и плюс можно добавить счетчик вызова NewInstance и, соответственно, уменьшение этого счетчика в FreeInstance. В принципе этот прием позволяет построить класс таким образом, чтобы клиент и не подозревал, что это синглетон.
← →
Piter © (2004-04-06 19:50) [136]А скажите комментария к моего ответу... а?! Нет, ну я понимаю, что ламер, но у меня есть хоть какие-нибудь шансы... черт побери
хоть на $300 я смогу устроиться в Москве.....
← →
Тимохов © (2004-04-06 19:52) [137]Зная хорошее знание Юрия потоков можно предположить, что он ожидает здесь потокобезопасную работу...
Я бы тоже делал через newinstence
Если нужно делать отлуп (т.е. не давать создавать вторую копию) то можно его делать и в конструкторе...
Я сам переодически с людьми беседую. Очень стало интересно, какие Юрий делает выводы из ответов на этот вопрос.
← →
Style © (2004-04-06 19:54) [138]>>Да вроде не очень много...
А мне кажеться можно столько напридумывать :)
например файл на диске С создать а в нем processid :0)
или в реестре сохранить информацию :)
Фантазируй как хош :)
← →
Юрий Зотов © (2004-04-06 19:56) [139]> Тимохов © (06.04.04 19:38) [132]
> какой ответ вы бы хотели услышать
Ну уж не через объект ядра, конечно - это уже стрельба из пушки по воробьям. IMHO, точнее всего условию задачи отвечает замещение NewInsance и FreeInstance с глобальной переменной в implementation.
← →
Vuk © (2004-04-06 19:56) [140]Если волнует потокобезопасность, то реальное создание экземпляра достаточно завернуть в критическую секцию...
← →
Тимохов © (2004-04-06 20:00) [141]
> Если волнует потокобезопасность, то реальное создание экземпляра
> достаточно завернуть в критическую секцию...
с этим никто не спорит.
У меня сложилось ощущение, что Юрий дает этот вопрос, не для того, чтобы получить конкретный ответ, а чтобы покопаться в знаниях будущего работника.
Хороший вопрос, говорит о знании ОПП в дельфи.
← →
Vuk © (2004-04-06 20:03) [142]to Тимохов © (06.04.04 20:00) [141]:
>Хороший вопрос, говорит о знании ОПП в дельфи.
Скорее о знании работы RTL.
← →
Тимохов © (2004-04-06 20:04) [143]
> Vuk © (06.04.04 20:03) [142]
У меня всегда были проблемой с терминами...
Согласен.
← →
Тимохов © (2004-04-06 20:06) [144]
> Piter © (06.04.04 19:50) [136]
меньше верьте тестам, больше в себя.
На денфи 300 очень сложно получать - такие работники просто никому не нужны - мы не настолько богаты, чтобы покупать дешевые вещи...
← →
Style © (2004-04-06 20:06) [145]
> Vuk © (06.04.04 17:04) [129]
> to Style © (06.04.04 16:28) [123]:
> >уж, хотел было сказать что какие проблемы, сделай компонент
> с
> >OnCreate :))
> У TFrame можно сделать. Даже работать будет. Иногда. :o)
Ну уж если очень захотеть можно в космос полететь )
А вообще можно и для наследника Panel сделать что то вроде OnCreate;
Ну предположим есть форма
type
TForm1 = class(TForm)
MyPanel1: TMyPanel;
procedure OnPanelCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
ну типа можно и компонент создать
TMyPanel = class(TPanel)
private
FOnCreate: TNotifyEvent;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if(integer(AOwner.MethodAddress("OnPanelCreate")) <> 0) then
@FOnCreate := AOwner.MethodAddress("OnPanelCreate");
if(Assign(FOnCreate)) then FOnCreate(Self);
end;
← →
Vuk © (2004-04-06 20:11) [146]to Style © (06.04.04 20:06) [145]:
Угу, а если захочется обработчик с другим имененм или на фрейм такой компонент сложить - все, кирдык. :o)
← →
Style © (2004-04-06 20:17) [147]Ну главное идея Ж8-)
Там уже можно что-нить еще придумать :) Может ресурсы покопать или еще чего :)
Сделать так чтобы имя обработчика бралось из ресурсов 8-)
Заодно плагин к Delphi написать чтобы это описание ввиде текста добавлялось к ресурсам самого EXE файла..
Я вот только не понял почему с фреймом не получится, у него что published свойств нет чтоли? :)))
← →
Suntechnic © (2004-04-06 20:19) [148]Тимохов © (06.04.04 20:00) [141]
У меня сложилось ощущение, что Юрий дает этот вопрос, не для того, чтобы получить конкретный ответ, а чтобы покопаться в знаниях будущего работника.
Хороший вопрос, говорит о знании ОПП в дельфи.
Это типичный вопрос практичеки любого интервью при приёме на работу программиста (неважно Delphi, C++ или С#). Это вопрос на знание патернов (Singleton pattern в данном конкретном случае). И если бы мне на такой вопрос ответили бы "какой ответ вы бы хотели услышать", то я бы сильно засомневался в опыте отвечающего как программиста.
← →
Piter © (2004-04-06 20:24) [149]
1.1.
High(I) = $7FFF FFFF
High(I) shr 8 = $007F FFFF
Ответ: $007F
как-то народ резво делает слишком. Имхо, самая проблема не в строчке High(I) shr 8. Это достаточно легко.
А вся проблема в смещении адреса + приведение к Word. А народ как-то этот этап пропускает, типа это очевидно и выдает ответ...
я не хочу никого обвинять, но кажется, что некоторые сначала получают ответ, а потом под него теорию подгоняют...
Да и в Help нет, нет, да заглянут... Помнить такие вещи наизусть - ну я просто завидую такой вместительной голове
← →
Vuk © (2004-04-06 20:25) [150]to Style © (06.04.04 20:17) [147]:
>Ну главное идея Ж8-)
У меня получше есть. Можно сделать обработчик OnLoaded. Везде будет работать. :o)
>Я вот только не понял почему с фреймом не получится, у него что
>published свойств нет чтоли? :)))
Есть, но у него владелец обработчика может не быть владельцем компонента.
← →
Игорь Шевченко © (2004-04-06 20:31) [151]Piter © (06.04.04 20:24)
Так вроде же написано: вопрос на знание в том числе и платформы x86. Как там байты с битами устроены. Очень хороший вопрос, кстати, я бы при желании такого компактного не придумал. Равно как и вопрос про OnCreate
← →
Piter © (2004-04-06 20:33) [152]Тимохов (06.04.04 20:06) [144]
На денфи 300 очень сложно получать - такие работники просто никому не нужны
да я слышал в некоторых новичкам и $100 платят... блин, нет, ну вы уже устроились, а что делать таким как я?! Нет опыта - никто не берет и возможностей нет. Попадаешь в левую фирму, где нелья поработать с хорошими людьми и набраться опыта. И что делать? эх...
← →
Piter © (2004-04-06 20:35) [153]Игорь Шевченко (06.04.04 20:31) [151]
Так вроде же написано: вопрос на знание в том числе и платформы x86
я не спорю - написано. Просто люди, когда объясняют, подробно расписывают вещи попроще, и совершенно не объясняют сложные вещи. Ведь строка PWord(Integer(@I) + 2)^;
сложнее, имхо, для понимания, чем
I := High(I) shr 8;
которую уже многие объяснили. А вот PWord(Integer(@I) + 2)^; просто ответ выдают, типа тут элементарнейшие вещи написаны, само собой разумеющееся
← →
Юрий Зотов © (2004-04-06 20:40) [154]> Piter © (06.04.04 19:50) [136]
> А скажите комментария к моего ответу... а?!
1.1 + (все очень четко, только на фига было с DEC мучиться)
2.1 - (скелет можно написать и без справки, это оговаривалось)
3.1 - (просто неверно)
3.2 * (ответ неполный)
3.3 - (практически не отвечено)
3.4 - (нет кода)
4.1 + (с небольшой натяжкой)
4.2 +
4.3 - (нет кода)
4.4 +
4.5 * (не сказано, как послать)
4.6 - (нет ответа)
Итого - примерно 5 очков из 12 (если звездочку считать за полбалла). Это неплохой результат. А на реальном собеседовании он, похоже, был бы повыше.
> Нет, ну я понимаю, что ламер,
Во-первых, Вы не ламер. Во-вторых, ламер, который понимает, что он ламер - он уже не ламер по определению. :о)
> хоть на $300 я смогу устроиться в Москве.
IMHO, без проблем. Но ведь Вы еще учитесь, а как же совмещать?
← →
Style © (2004-04-06 20:41) [155]2Vuk
Ну речь же шла об OnCreate :)
>>Есть, но у него владелец обработчика может не быть владельцем компонента.
т.е. владельцем может стать форма?
А на счет обработчика OnLoaded можно подробнее?
procedure TComponent.Loaded; virtual;
это Loaded нужно использовать??
← →
Verg © (2004-04-06 20:41) [156]function PiG( A, B : pointer ) : boolean;
begin
result := A > B;
end;
Как сделать, чтоб работало? :))
← →
Style © (2004-04-06 20:56) [157]Verg ©
function PiG( A, B : pointer ) : boolean;
begin
result := boolean(integer(A) > integer(B));
end;
← →
Verg © (2004-04-06 20:58) [158]
> Style © (06.04.04 20:56) [157]
Зачем boolean()?
Ладно, подождем еще вариантов :))
← →
Style © (2004-04-06 21:09) [159]2Verg
сам не знаю зачем )
Я даже не проверял :))
Да, хотя щас проверил все работает..
Pig(pointer(10), pointer(20)) = true;
result := integer(A) < integer(B);
хотя адрес в 4-х байтах может быть больше чем 7FFFFFFF
и тогда условие будет не верно, но можно попробовать использовать Cardinal
Pig(pointer(10), pointer($FFFFFFFF)) = true;
короче с integer такое будет работать не правильно
А вот так все рулит:
result := Cardinal(a) < Cardinal (B);
← →
panov © (2004-04-06 21:13) [160]>Verg © (06.04.04 20:58) [158]
-)
Самый простой способ:function PiG( A, B : PChar ) : boolean;
begin
result := boolean(integer(A) > integer(B));
end;
← →
panov © (2004-04-06 21:14) [161]Сорри, не то.
Только заголовок функции надо поменять - вместо pointer поставить PChar.
← →
panov © (2004-04-06 21:15) [162]function PiG( A, B : PChar ) : boolean;
begin
result := A>B;
end;
← →
Verg © (2004-04-06 21:18) [163]
> короче с integer такое будет работать не правильно
Так откуда и почему эта привычка поинтеры приводить к integer-ам
Integer - "Целое со знаком", со знаком, понимаете, со зна-ком!
Это так, просто "крик души"... :))
Еще, почему high(integer) можно, а high(pointer) - нет?
Никак не могу придумать ясную (словесную, не интуитивную) формулировку сему "эффекту"....:))
← →
Style © (2004-04-06 21:18) [164]Прикольно :)
Я то думаю в чем прикол :))
← →
Vuk © (2004-04-06 21:19) [165]to Style © (06.04.04 20:41) [155]:
>т.е. владельцем может стать форма?
Компонент лежит на фрейме, фрейм на форме, в качестве обработчика компоненту назначен метод формы.
>это Loaded нужно использовать??
Угу. Гарантировано работать будет, я думаю, не нужно объяснять почему.
← →
Юрий Зотов © (2004-04-06 21:20) [166]> Piter © (06.04.04 20:33) [152]
> А также всем, кто готов подписаться под этими словами:
> а что делать таким как я?! Нет опыта - никто не берет и
> возможностей нет. Попадаешь в левую фирму, где нелья
> поработать с хорошими людьми и набраться опыта. И что делать?
> эх...
Что делать, говорите?
Во-первых, не плакаться. Все через это проходят. Если я Вам скажу, с чего я начинал свою карьеру профессионального программиста (а это было всего 5 лет назад) - Вы ни за что не поверите.
Во-вторых, если Вы в Москве, если Вы знаете SQL и Interbase (вовсе не обязательно на суперпуперуровне, но неплохо), если по этому тесту Вы набрали не менее 4-х баллов (считая плюс за 1, а звездочку за 0.5), если Вы уже закончили учебу (или вот-вот ее закончите), если Вы действительно тащитесь от программизма и хотите работать в софтверной конторе (естественно, для начала на самой рядовой должности) - то можно послать свое резюме на job@elprise.ru
Гарантированного трудоустройства, золотых гор и легкой жизни не обещаю, но шансы устроиться есть. Дальнейшее во многом будет зависеть от Вас самих.
← →
Юрий Зотов © (2004-04-06 21:24) [167]> Verg © (06.04.04 21:18) [163]
> короче с integer такое будет работать не правильно
Теоретически - да, практически - доступные нам адреса все равно лежат в двух нижних гигах. Поэтому прокатит нормально и с Integer.
← →
Piter © (2004-04-06 21:24) [168]А можно огласить правильные ответы на вопросы:
- В чем принципиальное различие между классами TLabel и TStaticText?
- От какого класса наследуется класс TCollection и почему?
- У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?
- 3.4. Написать модуль, содержащий класс, который позволяет создать только единственный экземпляр объекта этого класса (эфективный вариант, а не с мьютексами, семафорами и т.д.)
- Как послать сообщение в безоконное приложение и как его там принять?
Юрий Зотов (06.04.04 20:40) [154]
Но ведь Вы еще учитесь, а как же совмещать?
Да сейчас нет, конечно. Я просто так прикидываю свои шансы...
просто вроде как и уже не мало времени в этой среде. И вроде как сравниваю уровень с другими и ничего хорошего не нахожу. Некоторые в 19 лет вроде уже и м фирмами сотрудничают, те их ведут, по выпуску сразу к себе берут, на теплое место, повышения квалификаци всякие там, дополнительные курсы за счет фирмы и т.д. А тут ощущаешь себя серой мышкой.
Просто вот странно, знал человека, который ОЧЕНЬ, ОЧЕНЬ хорошо разбирался в Дельфях. Он еще свой IRC клиент писал, причем грамотный и красивый, даже без глюков. Устроился помню на $450, причем на VC, так как работы на D не нашел... а вот вас слушаешь, даже $1000 это типа и не предел, хотя мне кажется, что программистам в России, окромя особых случае, больше не платят, что очень прискорбно осознавать, ибо это именно та отрасль, которая единственно мне нравится (ну если не считать там админство, то есть настройка компьютеров, но мне все таки больше по душе программинг).
P.S. Кстати, Юрий, вы не могли бы посмотреть ветку http://delphimaster.net/view/14-1081088912/ если ее просто не замечали. Особенно хочется услышать комментарии на посты № 27-28
Если замечали - но читать/отвечать не хотите - то не надо, я ни в коем случае не настаиваю
← →
Verg © (2004-04-06 21:29) [169]
> Юрий Зотов © (06.04.04 21:24) [167]
> > Verg © (06.04.04 21:18) [163]
>
> > короче с integer такое будет работать не правильно
>
> Теоретически - да, практически - доступные нам адреса все
> равно лежат в двух нижних гигах. Поэтому прокатит нормально
> и с Integer.
Хорошо, пусть пока прокатывает, я ведь не настаиваю - мне "просто за державу обидно" :))
← →
Игорь Шевченко © (2004-04-06 21:30) [170]Verg © (06.04.04 20:41)
PChar(A) > PChar(B) ?
← →
Verg © (2004-04-06 21:43) [171]
> Игорь Шевченко © (06.04.04 21:30) [170]
Ну, я надеюсь, ты меня понял...
← →
Style © (2004-04-06 21:43) [172]Verg ©
а чего кричать то так??
понимаю что со знаком, просто возможно мое сознание помутнилось глядя на енту функцию
и я почему то решил, что если число больше чем 7FFFFFF то оно станет отрицательным и соответственно меньше другому числу.
Но вот если в последнем варианте написать
Pig(pointer($FFFFFFFF), pointer(20))
то первый параметр будет больше чем второй..
>>>Еще, почему high(integer) можно, а high(pointer) - нет?
наверное High работает только с Ordinal, Array, or ShortString value типами.. к которым указатель не относится :)
← →
DmitryPV (2004-04-06 21:45) [173]Н да... И как меня еще на работе держат??? И тем более приняли. :)) На самом деле, ИМХО, првильно тут говорили, что каждый хорошо разбирается в основном в области, в которой приходится работать каждый день. Голова у человека не резиновая! Зачем тогда хелпы и в магазинах куча справочников?
Ну и конечно, прежде чем идти на собеседование, необходимо ВНИМАТЕЛЬНО прочитать требования к кандидатам. А то допустим, работает человек в основном с БД (как я например, Delphi+M$SQLServer), а начинаются тесты на крутой WinAPI, ессно основательно подзабытый, потому как не очень и нужный. И начинается...
← →
Verg © (2004-04-06 21:48) [174]
> Style © (06.04.04 21:43) [172]
> Verg ©
> а чего кричать то так??
Да, не, нормально все, просто задолбало маленько видеть это Integer(@P).
Но это мое, личное :) Я ж сказал - крик души.
> >>>Еще, почему high(integer) можно, а high(pointer) - нет?
> наверное High работает только с Ordinal, Array, or ShortString
> value типами.. к которым указатель не относится :)
Наверно, мысль идет в правильном направлении... :))
← →
Style © (2004-04-06 21:50) [175]> Теоретически - да, практически - доступные нам адреса все
> равно лежат в двух нижних гигах. Поэтому прокатит нормально
> и с Integer.
Вот как раз я подумал как оно возможно теоретически.
← →
Юрий Зотов © (2004-04-06 21:53) [176]> Piter © (06.04.04 21:24) [168]
Сначала о P.S.
Написано нормально. Может быть, местами немножко путано, но зато подробно, а кому надо - тот разберется. Есть мелкие замечания.
1. > Именно такой формат имеет ShortString. Первый байт...
Все же нулевой, а не первый. К нему прямо так и можно обращаться - Byte(S[0]) дает длину.
2. > тем более, что тип недокументирован
Уже документирован. В D7 структура AnsiString есть в справке (топик "Long string types").
3. Про AnsiString не сказано главное - что это, как и PChar, тоже указатель на первый символ тела строки. Это важно для понимания совместимости с PChar.
4. Еще можно добавить, что с длинными строковыми константами компилятор позволяет работать и как с AnsiString, и как с PChar, без преобразования.
4. И, если уж писать статью, то можно упомянуть, что AnsiString имеет управляемое время жизни (и пояснить, что это такое, для чего нужен RefCount, что есть область видимости). И что присвоение S1 := S2 дублирует адрес и увеличивает RefCount, но не приводит к размещению в памяти еще одной строки. И еще затронуть WideString, WideChar, PWideString и PWideChar. Но это все уже на усмотрение автора.
Теперь по поводу
> А можно огласить правильные ответы на вопросы
Думаю, все же не стоит. По крайней мере, пока что.
:о)
← →
Style © (2004-04-06 21:59) [177]2 Piter
>>>> даже $1000 это типа и не предел,
лично знаю таких Москвичей которые врядли бы ответили хоть на один вопрос из вышеприведенного теста И получают они не меньше 1000$.
Я бы в Москву и не поехал за меньшие деньги.
Какой смысл?? Даже с 1000$ если одному снимать квартиру, кормить себя, и тратиться на дорогу возможно у меня останется то что я в состоянии заработать у себя в Ногинске (ну если считать не только работу, с калымами вместе). Конечно немного выгодно, но не настолько чтобы бросать все и мчатся в Москву при первом предложении в 1000$. Нужно очень многое обдумать..
← →
Юрий Зотов © (2004-04-06 22:02) [178]> Verg © (06.04.04 21:29) [169]
> Хорошо, пусть пока прокатывает
Я так и знал, что слово пока прозвучит и будет выделено. Поэтому заранее заготовил ответ. :о)
Тип Integer - это generic тип. Так что смена платформы не грозит глобальной чисткой сырцов. Простая перекомпиляция снова даст native код.
Разве что в Win64 распеределение адресного пространства станет совершенно иным... но это вряд ли.
Хотя, если честно, я и сам старюсь приводить к unsigned.
← →
Vuk © (2004-04-06 22:05) [179]function PiG( A, B : pointer ) : boolean;
begin
result := longword(A) > longword(B);
end;
← →
Игорь Шевченко © (2004-04-06 22:08) [180]
> Теоретически - да, практически - доступные нам адреса все
> равно лежат в двух нижних гигах. Поэтому прокатит нормально
> и с Integer.
Задачи, они разные бывают. И доступные адреса необязательно лежат в двух нижних гигабайтах адресного пространства.
Пример: ключ /3GB и параметр LargeAddressAware у EXE-файла. И DLL, написанная на Delphi и загружаемая таким вот приложением :)
← →
Alex Konshin © (2004-04-06 22:12) [181]LongWord появилось довольно недавно (не помню в какой версии, IMHO в D4).
Если поищи в интернете, то в неком FAQ, имевшем хождение в FIDO тоже был приведен (мой:)) ответ с использованием PChar. Это работает для всех Delphi2+ версий.
← →
Piter © (2004-04-06 23:14) [182]Style (06.04.04 21:59) [177]
лично знаю таких Москвичей которые врядли бы ответили хоть на один вопрос из вышеприведенного теста И получают они не меньше 1000$
хы, а они кем работают? Не удивительно, если какой-нибудь директор деревоперерабатывающей фабрики не знает ответа ни на один вопрос :)
Плюс я не рассматриваю блат, а люди про которых ты говоришь получили работу, наверняка, именно так. Так куда хочешь можно устроиться.
Юрий Зотов (06.04.04 21:53) [176]
Может быть, местами немножко путано
блин. И вы тоже говорите, что путанно. А не могли бы дать рекомендации - что именно путано? В чем нелинейность? Только давайте тогда в той ветке, чтобы эту не засорять...
>И, если уж писать статью,
да не статья это. Это пояснение для вопроса в FAQ "Как преобразовать PChar к String и наоборот". Это типа пояснение для тех, кто хочет копнуть глубже.
Юрий Зотов (06.04.04 21:53) [176]
Думаю, все же не стоит. По крайней мере, пока что
почему? Хотя вы правы, я еще подумаю... :)
- В чем принципиальное различие между классами TLabel и TStaticText?
Посмотрел тут в справку. Все таки TStaticText потомок TWinControl, то есть это окно, имеет Handle.
И собсна можно прочитать HELP: Use TStaticText instead of TLabel when the component’s accelerator key must belong to a windowed control—for example, on an ActiveX property page
Это главное отличие?
- От какого класса наследуется класс TCollection и почему?
от TPersistent. А вот насчет почему... все классы, которые наследуются от TPersistent делают это для того, чтобы приобрести возможность сохранять свойства в поток. Верно?
Только не пойму - почему спросили про TCollection - я этот класс вообще как-то не встречал и что-то он не особо используется и мало где описывается...
- У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?
это я так понимаю вопрос века. Ну так почему, народ? Тут уже есть обсуждение, но я не очень понимаю, объясните плиз доступно.
- 3.4. Написать модуль, содержащий класс, который позволяет создать только единственный экземпляр объекта этого класса
Сам бы не догадался, но вы тут говорите про перекрытие NewInstance.
Стал смотреть. Во-первых, непонятно что за строка в обработчике TObject.NewInstance
Что за _GetMem ?
И собственно говоря, ведь в задании сказано написать модуль.
Почему не использовать какую-нибудь глобальную переменную, объявленную в этом модуле?type
TMyClass = class
constructor Create;
destructor Destroy; override;
end;
....
Ptr: TMyClass;
...
constructor TMyClass.Create;
begin
if Ptr=nil then
Ptr:=Self
else
abort;
end;
destructor TMyClass.Destroy;
begin
if Ptr=Self then
Ptr:=nil;
end;
Вроде нормально. Такой код не позволит создать более одного экземпляра класса TMyClass, причем глобальная переменная Ptr будет указывать на текущий экземпляр класса или равна nil, если такого экземпляра не существует...
← →
Style © (2004-04-06 23:32) [183]
> хы, а они кем работают? Не удивительно, если какой-нибудь
> директор деревоперерабатывающей фабрики не знает ответа
> ни на один вопрос :)
> Плюс я не рассматриваю блат, а люди про которых ты говоришь
> получили работу, наверняка, именно так. Так куда хочешь
> можно устроиться.
Не обязательно блат, не говоря даже о более серъездных организациях сейчас в Москве очень много различных фирм где люди уже намучались с так называемым блатом и им хотелось бы найти нормального специалиста который был бы способен выполнять требуемые задачи. Поэтому 1000$ - это нормальная зарплата.
← →
Юрий Зотов © (2004-04-06 23:35) [184]> Piter © (06.04.04 23:14) [182]
Про "вопрос века" еще подождем, пусть народ сам додумается. Это действительно вопрос несколько хитрый, там надо не только знать, но еще и сообразить.
Про Create - решение зачесть вполне можно, но все же оно не совсем точно отвечает формулировке вопроса. Там сказано - не дает создать - а Ваше решение создать дает, но тут же убивает. А вот замещение NewInstance именно не дает создать.
if Ptr = nil then
begin
Result := inherited NewInstance;
Ptr := Result // поэтому лучше объявлять Ptr, как TObject
end
else Result := Ptr;
И, конечно, во FreeInstance надо обнулить Ptr - чтобы снова разрешить создание.
← →
kaif © (2004-04-07 00:03) [185]Для меня $1000/мес весьма высокая зарплата. Я столько зарабатываю, лишь когда мне попадается хороший заказчик. В данный момент у меня такого нет. Но и программистом, собственно, я себя и не считаю. Я скорее инженер/философ - создатель систем. Мне проще написать систему типа Allegro (см. рекламный баннер), чем работать на хозяина с гарантированной зарплатой, пайком и и т.п. Возможно, это комплекс неполноценности. А может быть, просто я хорошо отдаю себе отчет в том, что отличает настоящее программирование от прикладного... Если мне удастся заработать определенные деньги на продаже новых полезных и мощных систем, то я, возможно, смогу пригласить хороших программистов, которые затем превратят эти системы в настоящее произведение искусства...
И тогда я буду думать не о том, насколько хорошо эти ребята знают VCL или Object Pascal. Я буду думать о том, насколько они хорошо знают английский язык (чтобы придумывать смачные и короткие понятия, названия свойств, событий и методов), насколько у них железная минималистическая логика (чтобы не плодили классы, которые я и сам в состоянии наплодить) и чтобы соображаловка работала самостоятельно и эстетика и эргономика были - в крови. Вот как бы я рассуждал. Чтобы с радостю брали на себя ответственность и не боялись удивить меня новыми и смелыми решениями. Пусть перечеркнут все, что я сделал, но при этом пусть сохранят преемственность версий и уважают конечного юзера. Он (этот юзер) не виноват, что у нас много проблем. Это наши проблемы...
Я убежден, что философия рождает новые идеи. Идущие вразрез с тем, что общепринято, но не работает, хотя все и пытаются делать вид, что работает... И те, кто способны выдвигать такие идеи - для меня - главный движитель работы. Это те, кому я всецело могу доверять. Даже если 90% времени они просто лежат в депрессии на диване и ничего не делают, им я доверяю больше, чем тем, кто все знает и ничего не создает...
← →
Style © (2004-04-07 00:22) [186]>>Для меня $1000/мес весьма высокая зарплата. Я столько
>>зарабатываю, лишь когда мне попадается хороший заказчик.
Значит у вас работа не постоянна :(
Да конечно зарплата не маленькая,хотя это такая зарплата, на которую можно снимать квартиру, и жить в Москве вообще. А с другой стороны для Москвы как бы это не самая высокая заработная плата :)
Хотя предложений на 1000$ не мало, именно на постоянную работу.
← →
Cobalt © (2004-04-07 00:57) [187]Насчёт OnCreate - немного порассуждаем:
Итак, мы знаем, что эти события есть только у форм и модулей данных (В стандартном наборе). При их возникновении все дочерние контролы уже созданы и их свойства установлены (Design-time).
Предназначены они для дополнительной настройки свойств контролов/(внутренних структур данных), которые в Дизайн-режиме не установить, поскольку они зависят от каких-то посторонних факторов.
Обработчик задаётся в Design-time. И вызывается он непосредственно опосля (конкретно сам не проверял, но предполагаю) создания формы (а также загрузки её из ресурсов, где прописан также и обработчик).
При ручном создании формы обработчик OnCreate также вызывается без непосредственного указания программиста, и отменить его нельзя (опять же имхо).
Для прочих же контролов загрузка из ресурсов не предполагается.
При создании простого контрола негде указать ему обработчик (хотя это в принципе, можно передать ему в конструктор адрес процедуры)
Итак, это было такое вот размышление, а теперь эссенция:
Метод-обработчик OnCreate должен быть методом того же класса (или владельца), которому он присваивается в качестве обработчика события - сие есть гарантия существования экземпляра самого объекта-владельца метода (при работе с полями класса).
← →
kaif © (2004-04-07 01:12) [188]А я вот вообще не знаю, почему у каких-то компонентов нет события OnCreate. Например, для Frame-ов это событие совсем бы не помешало. Из-за отсутствия OnCreate у фреймов мне приходилось всякий раз переопределять их виртуальный конструктор Create. Правда мне один чел более красивое решение показал, но я его не помню, так как забыл. :(
Спрашивать, почему у Frame-ов нет OnCreate то же самое, что спрашивать, почему Бог триедин. Ну триедин - и все тут.
← →
Sergey Masloff (2004-04-07 07:03) [189]Piter © (06.04.04 23:14) [182]
// НАЧАЛИ ЦИТАТУ
type
TMyClass = class
constructor Create;
destructor Destroy; override;
end;
....
Ptr: TMyClass;
...
constructor TMyClass.Create;
begin
if Ptr=nil then
Ptr:=Self
else
abort;
end;
destructor TMyClass.Destroy;
begin
if Ptr=Self then
Ptr:=nil;
end;
Вроде нормально. Такой код не позволит создать более одного экземпляра класса TMyClass, причем глобальная переменная Ptr будет указывать на текущий экземпляр класса или равна nil, если такого экземпляра не существует...
// Законцили цитату
И
...
for i := 0 to infinity do
begin
with TMyClass.Create() do something;
Ptr := nil;
end;
← →
stone © (2004-04-07 09:53) [190]
> А то допустим, работает человек в основном с БД (как я например,
> Delphi+M$SQLServer), а начинаются тесты на крутой WinAPI
Я такое встречал. Пару лет назад искал работу, пошел на одно собеседование, зарплата приличная, из требований - разработка БД и администрирование MSSQL, опыт работы с Delphi является плюсом. Пришел, дали тест. Ответил на 80%. Удивило то, что в тесте не было не только ни одного вопроса по MSSQL, но даже хотя бы косвенно связанного с БД. От дальнейшего собеседования отказался.
← →
Fantasist. (2004-04-07 10:24) [191]/ точнее всего условию задачи отвечает замещение NewInsance и FreeInstance с глобальной переменной в implementation./
Я, конечно, понимаю, что перекрывать NewInsance и FreeInstance это круто, но почему-то для создания singleton"a я применял такой алгоритм:
TSingleton = class
private
constructor Create();
public
function GetInstance:TSingleton;
end;
implementation
var
singleton:TSingleton;
function GetInstance():TSingleton;
begin
if (singleton = nil) then
singleton:=TSingleton.Create;
return singleton;
end;
Эх давно я на делфе не пописывал. Неужто там такое решение не приемлемо?
← →
Юрий Зотов © (2004-04-07 10:55) [192]> А то допустим, работает человек в основном с БД (как я
> например, Delphi+M$SQLServer), а начинаются тесты на крутой
> WinAPI
Уважаемые господа, работающие с БД! А также работающие с DirectX! А также работающие еще с чем угодно!
Вы, случаем, не забыли о том, что здесь приведена часть теста, используемого КОНКРЕТНОЙ командой в своих КОНКРЕТНЫХ целях? Вот НАМ от ЭТОГО теста нужно именно ЭТО, а что и от чего нужно ВАМ - дело Ваше.
Честное слово, я Вам ничего не навязываю и уж тем более не мешаю придумать Ваш собственный тест. В том виде, в котором он нравится Вам. А также не мешаю вообще ничего не придумывать. Это дело исключительно Ваше.
Но мне кажется, что если у Вас в команде нет хотя бы одного человека, способного пройти именно ЭТОТ тест (причем ТОЧНО и ПОЛНОСТЬЮ) - то это значит, что такая команда вообще никакую действительно приличную Delphi-программу написать просто не может. В принципе.
Вот таково мое личное мнение. IMHO, то есть. Но можете поверить, что оно далеко не безосновательно.
← →
Юрий Зотов © (2004-04-07 11:03) [193]> Fantasist. (07.04.04 10:24) [191]
> перекрывать NewInsance и FreeInstance это круто
Обычное перекрытие виртуального метода. Что же тут крутого?
> но почему-то для создания singleton"a я применял такой
> алгоритм:
Почему Вы применяли именно его, я не знаю, но советую все же прочесть [182] и [184]. Чтобы не повторять того, что уже говорилось.
← →
serge35 (2004-04-07 11:13) [194]Если на собеседовании предлагают ответить на несколько десятков вопросов по теории, значит работодателю нужен специалист с дипломом, желательно МГУ,МИФИ и т.д. для того, чтобы с гордостью заявлять всем, что у нас работают лучшие программисты.
Пусть даже на выходе чуть больше 0. Зато какой коллектив!!!
← →
stone © (2004-04-07 11:16) [195]
> Юрий Зотов © (07.04.04 10:55) [192]
Плохое у меня сегодня настроение, поэтому начну придираться к словам, требуя, в Вашей манере, их обоснования.
> Но мне кажется, что если у Вас в команде нет хотя бы одного
> человека, способного пройти именно ЭТОТ тест (причем ТОЧНО
> и ПОЛНОСТЬЮ) - то это значит, что такая команда вообще никакую
> действительно приличную Delphi-программу написать просто
> не может. В принципе.
>
> Вот таково мое личное мнение. IMHO, то есть. Но можете поверить,
> что оно далеко не безосновательно.
Ни я, ни ни кто из нашей команды не смог ответить на вопрос:
1.1. Чему будет равно W после выполнения следующего кода 32-битным процессором семейства x86? Ответ объяснить.
type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;
значит, никто не прошел ЭТОТ тест (причем ТОЧНО и ПОЛНОСТЬЮ), значит, что такая команда вообще никакую действительно приличную Delphi-программу написать просто не может.
Вот только интересно почему?
ЗЫ. Мы создаем программу, которая работает с СУБД MSSQL.
ЗЗЫ. Чем отличить действительно приличную Delphi-программу от неприличной Delphi-программы?
← →
Юрий Зотов © (2004-04-07 11:19) [196]> kaif © (07.04.04 00:03) [185]
Видимо, Вам просто не приходилось работать в команде и нанимать конкретных людей под конкретную работу. Видите ли, в команде нужны не только лежащие на диване творцы идей, но и те, кто до творения философии пока еще не дорос, но зато умеет эту кем-то рожденную философию понять сам и объяснить ее компьютеру. На понятном КОМПЬЮТЕРУ языке.
Причем вторых обычно нужно гораздо больше, чем первых.
← →
Romkin © (2004-04-07 11:29) [197]Юрий Зотов © (07.04.04 10:55) [192] Вот уж ИМХО!! Мдя...
Я не особо помню, отвечал на этот тест давно, в прошлый раз. Но ответил не полностью :(
Пойду посыпать голову пеплом - никакую приличную программу написать не можем :(((
← →
Юрий Зотов © (2004-04-07 11:44) [198]> stone © (07.04.04 11:16) [195]
> Вот только интересно почему?
Если никто не смог ответить именно на вопрос 1.1, значит, никто толком не знает основ программирования. Вы спроектировали хорошую базу, пишете сложные запросы - все чудесно. И до тех пор, пока клиентская часть пишется на уровне таскания компонентов по форме - тоже все прекрасно.
Но когда-нибудь выяснится, что база непомерно раздулась и всякие там BLOB"ы нужно хранить в компрессированном виде. И что при некотором объеме базы и некоторой нагрузке на сервер программа начинает непомерно тормозить - и нужно что-то кэшировать на клиенте. И т.д., и т.п.
Вот тут-то и понадобится человек, способный ответить на вопрос 1.1.
← →
stone © (2004-04-07 11:56) [199]
> Юрий Зотов © (07.04.04 11:44) [198]
Разводить флейм по поводу того, что может или не может произойти в обозримом (или далеком будущем) по тем или иным причинам, сродни "делению шкуры неубитого медведя". Я не спорю, что чем больше знаний, тем лучше. Просто не слишком ли категоричное Ваше ИМХО...
Собственно, это и было сутью вопроса.
← →
pasha_golub © (2004-04-07 11:58) [200]Юрий Зотов © (07.04.04 11:44) [198]
Со всем уважением к вам, но мне кажется, что 1.1 это интересный теоретический вопрос (даже очень, эдакая головоломка), но не более.
← →
mfender © (2004-04-07 12:04) [201]serge35 (05.04.04 17:45)
Поищи работу подешевле.
Там не так придираются...
Где дешевле.... Иногда за копейки хотят соорудить вавилонское столпотворение, и к организаторам сего требования как минимум - на $1000000.
Хотя, думаю, за такую работу и браться-то не стоит. Себе дороже выйдет.
← →
VAleksey © (2004-04-07 12:08) [202]
> Юрий Зотов © (07.04.04 11:44) [198]
> > stone © (07.04.04 11:16) [195]
Думаю, что все-таки товарищ Stone в этом случае легко разберется в этом вопросе.
Может и не легко, но уж точно решит задачу.
← →
Юрий Зотов © (2004-04-07 12:14) [203]> VAleksey © (07.04.04 12:08) [202]
И в этом случае товарищ Stone легко ответит на вопрос 1.1. Может, и не легко, но уж точно ответит.
То есть, товарищ Stone как раз и станет тем самым членом команды, о котором идет речь. Что подтверждает мои слова.
← →
Vuk © (2004-04-07 12:16) [204]to Юрий Зотов © (07.04.04 11:44) [198]:
>Вот тут-то и понадобится человек, способный ответить
>на вопрос 1.1.
Юрий, дело в том, что если человек не смог это прочитать, это еще не значит, что он не сможет написать то же самое, при этом понимая, что делает. Ну и, опять же, IMHO в нормальном проекте никто такого не напишет. Именно из-за плохой понятности алгоритма из этого кода. Но об этом еще в первый раз много говорилось. И именно по поводу первого вопроса.
← →
Nous Mellon © (2004-04-07 12:35) [205]ИМХО как раз самый интересный и заставляющий подумать вопрос это 1.1.
Тут проверяются ИМХО и знания и соображалка. Еще интересен вопрос про OnCreate я честно говоря так до конца и не понял его..
Может быть кто-нибудь просветит?
Остальные на знание теории, ИМХО опять же...
To Юрий Зотов
OFF
А ваш проект уроки для начинающих восстановлению не подлежит?
Просто в той ветке (c пятым этапом) вы обмолвились о том что готова часть шестого, может быть хотя бы зачатки существуют? Очень уж интересно...
END OFF
← →
Alex Konshin © (2004-04-07 12:45) [206]Nous Mellon © (07.04.04 12:35) [205]
Не знаю, не знаю. У меня он никакого интереса не вызвал. Если знаешь и пишешь на ассемблере, то такие фрагменты никаких затруднений не вызывают.
← →
Тимохов © (2004-04-07 12:47) [207]>>>>Suntechnic © (06.04.04 20:19)
Про стандатность вопроса.
Стандарт описан?
Т.е. я понимаю должно быть что-то такое "стандарт механизма позволяющего создавать всего один объект заданного класса, будь то в дельфи, будь то в си"?
Интересно где вы такие стандарты видели...
Гон все это. Решений масса. Вопрос, "как бы вы хотели услышать" имеет место иначе интервью превратится в долгий диспут.
← →
Тимохов © (2004-04-07 12:49) [208]>>>>Piter © (06.04.04 20:33)
что делать? искать где вам не будут платить 100 или 300, хотя бы 500. меньше - себя не уважать.
искать и еще раз искать.
сами понимаете, знания нужны обязательно. можно узкие, но хорошие.
для меня опыт - фигня. чем опытней, тем гонора больше.
← →
Игорь Шевченко © (2004-04-07 12:58) [209]Тимохов © (07.04.04 12:47)
> Гон все это. Решений масса.
И все-таки, решений не масса :))
← →
Nous Mellon © (2004-04-07 13:02) [210]
> [206] Alex Konshin © (07.04.04 12:45)
Ну вы то - опытнейший программист, вопрос, наверно, как орешек щелкнули, а для меня это пища для ума.. :)
← →
Style © (2004-04-07 13:10) [211]>>> И все-таки, решений не масса :))
Нормальных решений да,
но вообще можно столько всего навыдумывать.
← →
kaif © (2004-04-07 13:43) [212]2 Юрий Зотов © (07.04.04 12:14) [203]
Возможно, во многом Вы и правы. Пожалуй, хорошо было бы, если бы все программисты с легкостью владели техникой программиования.
Но я бы поступил так: опубликовал на сайте своей фирмы некий курс обучения, ссылки на ряд обязательных книг и тестовых примеров, которые все обязаны пройти. И официально объявил бы, что знание всего этого есть обязательное условие приема на работу в моей фирме. Чтобы у людей было время и возможность подготовиться.
При приеме на работу устраивал бы не тест, а настоящий экзамен на знание этого материала и умение решать все элементарные задачки в рамках этого курса. Тогда я был бы уверен, что все работники хотя бы это знают и умеют.
Отдельно при объявлении конкурсов на вакансии выдвигал бы особые требования (в дополнение к имеющимся), в зависимости от того, чем человек будет заниматься.
Тогда не будет возникать разговоров о том, что какие-то элементы теста "надуманы" или представляют собой "извращение". Ведь не возникает таких проблем в академических сферах (вступительный экзамен по математике в МГУ). Так как ясно, что именно должен знать абитуриент и каждая задача четко относится к какой-то определенной сфере знаний и навыков.
← →
Тимохов © (2004-04-07 13:54) [213]
> Игорь Шевченко © (07.04.04 12:58) [209]
с ходу:
1. через newinstance
2. через конструктор в возбуждением исключения
3. через классовый метод класса с вызовом private конструктора.
ясно, что самый "прямой" это 1.
к тому же 2 - не решает проблему, если нужно подменять новый класс уже созданным (ответ что значит "не позволяет" я так и не получил).
Надо еще умножить это все на два, в случае если требуется потокобезопасная работа...
одним словом уточнения вопроса не избежать...
ну это и нормально - раз человек уточняет, значит сразу продумал кучу вариантов, типа крутой. :))))
← →
Danilka © (2004-04-07 14:01) [214]Как определить чего ты стоишь как программист.
Чего тебе платят, того ты и стоишь, не больше не меньше :))
← →
Матлабист (2004-04-07 14:07) [215]
> Со всем уважением к вам, но мне кажется, что 1.1 это интересный
> теоретический вопрос
А мне кажеться, что это сугубо практический вопрос. Теоретический это, например, НБФ-грамматики и связанные с ними теоремы... Реляционная алгебра и пр.
← →
Юрий Зотов © (2004-04-07 15:50) [216]> Матлабист (07.04.04 14:07) [215]
Вероятно, этот и другие вопросы считают теоретическими те, в чьей практике такие вопросы не встречались.
:о)
← →
geg © (2004-04-07 16:01) [217]Однако дискуссия развернулась . Вроде не такой и тяжелый вопрос был .
А я вот подумал.. Реально в Питере 1000 $ найти работу тяжело для программиста. А семью содержать надо.. Может уйти в какую ни будь кантору по внедрению программистом на внутренний язык. Платят там хорошо. А программированием заниматься для себя или еще на заказ писать.. Благо время от времени такие заказы попадаются.
← →
Suntechnic © (2004-04-07 16:07) [218]Тимохов © (07.04.04 12:47) [207]
Про стандатность вопроса.
Стандарт описан?
Описан, описан (смотри ссылку ниже).
Т.е. я понимаю должно быть что-то такое "стандарт механизма позволяющего создавать всего один объект заданного класса, будь то в дельфи, будь то в си"?
Механизмы создания везде разные, но паттерн один.
Интересно где вы такие стандарты видели...
Например здесь и ещё в массе подобных книг.
http://www.amazon.com/gp/reader/0201633612/ref=sib_dp_pt/104-4504356-5980706#reader-link
Гон все это. Решений масса. Вопрос, "как бы вы хотели услышать" имеет место иначе интервью превратится в долгий диспут.
Если ты также планитруете отвечать на интервью, то советую пересмотреть свою позицию.
← →
Владислав © (2004-04-07 16:11) [219]> Тимохов © (07.04.04 13:54) [213]
Не соглашусь таки с Вами. П. 1 самый действующий. Все остальное больше похоже на извращение для мазохистов :) (без обид). А почему мое ИМХО именно такое... ведь этим классом (и экземпляром) еще и пользоваться надо.
Кстати, я вот никак не могу понять, как с помощью варианта в п. 2 можно "по человечески" полчить уже созданный экземпляр.
← →
pasha_golub © (2004-04-07 16:15) [220]Юрий Зотов © (07.04.04 15:50) [216]
Блин, хоть убейте не могу представить где такой код могу написать, или хотя бы похожий.
← →
Тимохов © (2004-04-07 16:16) [221]
> Владислав © (07.04.04 16:11) [219]
> Кстати, я вот никак не могу понять, как с помощью варианта
> в п. 2 можно "по человечески" полчить уже созданный экземпляр.
Никак.
Но вопросу ЮЗ это не противоречит - там было сказано "не позволяет" - если в create сделать raise, то это и будет "не позволяет."
← →
Тимохов © (2004-04-07 16:28) [222]
> Suntechnic © (07.04.04 16:07) [218]
Очень рад, что ты читаешь такие книжки.
И слова то какие умные "патттерн"!
Не надо мне тыкать умными словами - сам не в детском саду.
Ни одна книга (даже указанная тобой) не может декларировать, что реализовывать задание ЮЗ в дельфи надо именно через NewInstance и никак иначе.
Будешь спорить?
← →
pasha_golub © (2004-04-07 16:35) [223]Тимохов © (07.04.04 16:28) [222]
Дим, да чего ты ерепенишься? :-) Мы ж тута, типа, все культурные, каждый второй с ВО.
← →
Suntechnic © (2004-04-07 16:38) [224]>Тимохов ©
Все что я хотел написать я уже написал. Далее твое дело как поступать.
← →
Style © (2004-04-07 16:40) [225]
> pasha_golub © (07.04.04 16:15) [220]
Сделайте поиск по исходникам delphi на "integer(@"
сколько файлов он найдет?
Значит наверное есть практическое применение?
← →
Тимохов © (2004-04-07 16:41) [226]
> pasha_golub © (07.04.04 16:35) [223]
согласен.
немного погорячился.
но вроде ничего обидно не сказал.
сам понимешь, когда тебе утверждают, что паттернами можно решить все, немного странно это выглядит.
для меня это разговор начался с того, что у ЮЗ я спросил, что значит "не позволяет". в зависимости от ответа и решения разные могут быть. а мне тут про паттерны...
конечно я могу оказаться совсем отсталым и слово "позволяет" имеет определенное значение в паттернах или вообще есть такой паттерн "позволяет" и "не позволяет", но я очень в этом сумлеваюсь, т.к. приведенная сантехником книга была на английском, и слова "позволяет" там точно нет.
ЗЫ Сантехник, прости, если обидел.
← →
Тимохов © (2004-04-07 16:43) [227]
> Suntechnic © (07.04.04 16:38) [224]
> >Тимохов ©
> Все что я хотел написать я уже написал. Далее твое дело
> как поступать.
Вот он, ответ мастера :)))
Спасибо за заботу, выводы буду делать...
:)
← →
pasha_golub © (2004-04-07 16:48) [228]Style © (07.04.04 16:40) [225]
Ой, ну не надо. Я понимаю, что работа с адресами ведется полным ходом, но я то спрашивал про связку из трех строчек, а не про вырванную из контекста одну. ;-)
← →
Style © (2004-04-07 16:51) [229]pasha_golub ©
Но каждая из этих строчек может использоваться отдельно, поэтому
понять их просто необходимо...
← →
pasha_golub © (2004-04-07 16:52) [230]Style © (07.04.04 16:51) [229]
Вот, блин. Каждая, конечно может, а три сразу, где-то могут?
← →
Dmitriy O. © (2004-04-07 16:59) [231]А я предлагаю определять крутость программера хотябы на этом сайте по количеству скачиваний его проги из кладовки. Тогда явно не досегаемо крут pasha_golub © . А потом иду я.
← →
Style © (2004-04-07 17:02) [232]pasha_golub ©
но в задании 1.1 смысл не заключается в том что потом все этот пример начнут использовать практически.. Смысл в том чтобы понять. Тогда другие практические задачи будут гарантированно выполнены осознанно.
← →
Тимохов © (2004-04-07 17:03) [233]
> Dmitriy O. © (07.04.04 16:59) [231]
да, надо выложить свою годами собираемую библиотеку всякой всячины, сопроводить описанием, и буду крут, ну конечно после Dmitriy O. , но круче чем АП.
хороший метод, я согласен.
← →
Матлабист (2004-04-07 17:10) [234]По поводу пресловутого вопроса 1.1 Иногда приходиться пользоватся CPU Winodow. И в дампе структуры вспоминаешь, в каком порядке байты идут... Так что вопрос скорее сугубо практический... Теории безразлично, в каком порядке идут байты. Она концентрируется на более общих вопросах.
← →
Piter © (2004-04-07 17:38) [235]Verg (06.04.04 21:18) [163]
Так откуда и почему эта привычка поинтеры приводить к integer-ам
Integer - "Целое со знаком", со знаком, понимаете, со зна-ком!
ну и что? Если $OVERFLOWCHECKS отключен (а так и есть по умолчанию и обычно не включают, ибо тормозит выполнение), то все будет нормально.
Verg (06.04.04 21:18) [163]
почему high(integer) можно, а high(pointer) - нет?
потому что указатель это не число. Это указатель :)
Другое дело, что его используют в виде, похожем на 4--х байтовое целое беззнаковое, так как было бы неудобно, если бы говорили - переменная находится по адресу "AvTk", что эквивалентно $4176546B или 1098273899
← →
Тимохов © (2004-04-07 17:46) [236]
> Piter © (07.04.04 17:38) [235]var
p: pointer;
i: integer;
begin
p := pointer($ffffffff);
i := integer(p);
end;
будет работать и при включенном overflowchecks...
← →
Юрий Зотов © (2004-04-07 18:13) [237]> pasha_golub © (07.04.04 16:15) [220]
> Блин, хоть убейте не могу представить где такой код могу
> написать, или хотя бы похожий.
Насколько я помню, совсем недавно на "Основной" мы говорили о том, что некий разработчик нуждается в менеджере тултипов?
Ну так вот: этот менеджер - типичнейший Singleton. Вопрос 3.4.
Как и другие подобные менеджеры. А также и другие глобальные объекты.
Желаете ли еще примеров?
:о)
← →
Style © (2004-04-07 18:21) [238]А может мне кто объяснить почему
r = 100 когда его пределы от 1 до 5 ????
type
TRange = 1..5;
var
R: TRange;
begin
a := 100;
r := Trange(a);
end;
← →
Тимохов © (2004-04-07 18:24) [239]
> Style © (07.04.04 18:21) [238]
т.к. вы делаете явное преобразование типов.
← →
Юрий Зотов © (2004-04-07 18:25) [240]> Style © (07.04.04 18:21) [238]
Включите птичку "Range Checking" в опциях компилятора.
← →
Style © (2004-04-07 18:29) [241]
> т.к. вы делаете явное преобразование типов.
не совсем понял что значит явное?
Если я напишу константу - число 6
то компилятор выдаст ошибку, а в RunTime TRange получается хранится как INTEGER т.е. размеры типа TRange там не играют никакого значения?
← →
Тимохов © (2004-04-07 18:32) [242]
> Юрий Зотов © (07.04.04 18:25) [240]
> > Style © (07.04.04 18:21) [238]
>
> Включите птичку "Range Checking" в опциях компилятора.
Юрий, я конечно могу ошибаться, но и при range checking это также будет срабатывать...
....
проверил, именно так и есть - у меня не ругается.
← →
Verg © (2004-04-07 18:34) [243]
> Piter © (07.04.04 17:38) [235]
> Verg (06.04.04 21:18) [163]
> Так откуда и почему эта привычка поинтеры приводить к integer-ам
> Integer - "Целое со знаком", со знаком, понимаете, со зна-ком!
>
> ну и что? Если $OVERFLOWCHECKS отключен (а так и есть по
> умолчанию и обычно не включают, ибо тормозит выполнение),
> то все будет нормально.
Начни с постановки вопроса
Verg © (06.04.04 20:41) [156]
← →
Тимохов © (2004-04-07 18:36) [244]У меня в общем такой код
var
R: TRange;
a: integer;
begin
a := 100;
r := TRange(a);
end;
работает при любых опциях компилятора.
аvar
R: TRange;
a: integer;
begin
a := 100;
r := a;
end;
не работает при range checking +
← →
Style © (2004-04-07 18:37) [245]Юрий Зотов ©
Все понял...
Зато я могу сделать RangeCheck сам если
необходимо при помощи Low и High...
Просто думаю если не включена Overflow checking и я превышаю предел integer то число становится отрицательным, вот как бы сделать такое с TRange?
← →
Юрий Зотов © (2004-04-07 18:42) [246]Значит, все дело в прямом приведении типа. Увидев его, компилятор говорит "Ну, что ж, Вы сами этого хотели" - и не вставляет код проверки значения.
← →
Игорь Шевченко © (2004-04-07 18:45) [247]Тимохов © (07.04.04 18:36)
Такой код:
var
A: TButton
B: TStringList;
begin
B := TStringList.Create;
A := TButton(B);
end;
Тоже будет работать. До тех пор, пока к А не обратятся, как к TButton
← →
Style © (2004-04-07 18:48) [248]Юрий Зотов ©
А я так понял что на самом деле "тип" TRange принемает значение
того основного числового типа в чьих пределах лежит его предел :) во загнул
Легко проверить
TRange = 1..256;
var
R: TRange;
begin
a := -1;
r := TRange(a);
r сейчас равно 65535
а если
TRange = 1..254;
то r = 255
:)))
← →
Тимохов © (2004-04-07 18:49) [249]
> Игорь Шевченко © (07.04.04 18:45) [247]
а я спорю? :)))))
имхо, Юрий очень точно все сказал в пред. посте.
← →
Тимохов © (2004-04-07 18:51) [250]
> Style © (07.04.04 18:48) [248]
тип trange существует лишь для того, чтобы сказать компилятору, что при нормальной работе с переменными этого типа (т.е. без явных преобразований) нужно вставлять range check (если таковый есть в опциях проекта).
во загнул...
← →
Verg © (2004-04-07 18:54) [251]
> Тимохов © (07.04.04 18:51) [250]
Когда-то компиляторы Паскаля (по-крайней мере некоторые) не имели встроенного типа Word, только integer и byte
Там так и писали
type
Word = (0..65535);
← →
Style © (2004-04-07 18:54) [252]Тимохов ©
Да я понял на счет range check
но мне просто хотелось что если бы я написал
TRange(100) то тот мне возвратил 5 :)
← →
Тимохов © (2004-04-07 18:55) [253]
> Style © (07.04.04 18:54) [252]
на фиг такие типы.
имхо толку от них мало - потенциальное место для ошибки
имхо, конечно.
(прикрывая готову руками - вот сейчас ревнители дельфи налетят и порвут)
← →
Юрий Зотов © (2004-04-07 19:04) [254]> Style © (07.04.04 18:48) [248]
Размер пользовательского порядкового типа определяется исходя из его предельных значений и всегда по минимуму. А для реального представления берется ближайший стандартный тип.
TRange = 1..254; // Это 1 байт и фактически берется Byte.
TRange = 1..256; // Это 2 байта и фактически берется Word.
Вы загоняете в него FFFFFFFF. Лищнее отсекается и в первом случае получается FF (т.е. 255), а во втором FFFF (т.е. 65535). Поскольку используется прямое приведение, ошибок переполнения и выхода за диапазон не возникает.
← →
Style © (2004-04-07 19:13) [255]Юрий Зотов ©
Не я прекрасно понял что берется ближайший стандартный тип
Но думал что прямое преобразование ограничит число не в пределах стандартного типа, а в пределах TRange
> имхо толку от них мало - потенциальное место для ошибки
Не думаю что это место для ошибки в конце концов можно было бы поставить тот же range check.
← →
Style © (2004-04-07 19:15) [256]В общем для таких целей можно и функцию написать которая определяет по High и Low число которое будет лежать именно в диапазоне TRange а не за его пределами.
← →
Тимохов © (2004-04-07 19:17) [257]
> Style © (07.04.04 19:15) [256]
ставьте, не ставьте range check - при явном преобразовании толку не будет.
этот тип имхо так - для красоты...
← →
Юрий Зотов © (2004-04-07 19:19) [258]> Style © (07.04.04 19:13) [255]
Чтобы понять все до конца, повторите то же самое, что Вы делали в [248], но только возмите A типа Cardinal и равное $ABCD. А при анализе результатов смотрите R в виде HEX и вспомните тот самый вопрос 1.1.
:о)
← →
Юрий Зотов © (2004-04-07 19:21) [259]> Тимохов © (07.04.04 19:17) [257]
> этот тип имхо так - для красоты...
Не для красоты, а для отладки. А иногда и не только для отладки. Очень удобная паскалевская фича.
← →
Тимохов © (2004-04-07 19:23) [260]
> Юрий Зотов © (07.04.04 19:21) [259]
наверное,
но у меня как-то с ним любовь не сложилась.
← →
Fantasist © (2004-04-07 19:34) [261]
> с ходу:
> 1. через newinstance
> 2. через конструктор в возбуждением исключения
> 3. через классовый метод класса с вызовом private конструктора.
>
> ясно, что самый "прямой" это 1.
Лично для меня, самый прямой был бы 3, именно его я и привел (с помарками, правда). Но Делфи, в этом деле порядочная сволочь - конструктор объявлен public в TObject, поэтому, как минимум, он всегда доступен. Вариант 2, конечно, не практический, остается только 1, хотя мне в нем как раз и не нравиться, что клиенту не очевидна особенность данного класса. В коде это будет выглядеть как создание нового экземпляра. Решение 3 было бы вернее, но в Делфи не применимо.
← →
Юрий Зотов © (2004-04-07 19:34) [262]> Тимохов © (07.04.04 19:23) [260]
Из чего я делаю вывод, что Вы больше приверженец Асма и Си, чем Паскаля. Большинство из них так и считают - лишнее, мол. А ведь это действительно очень удобно - полнота и качество отладки и тестирования заметно возрастают, причем без малейших усилий с нашей стороны.
Еще раз приведу пример из своей реальной практики (язык PL/1, который запросто конвертировал что угодно во что угодно).
DCL // Это Паскалевское var
I DEC FIXED(1); // То есть, одна десятичная цифра
DO I=0,9 // Это Паскалевское for I := 0 to 9 do
... // тело цикла
И получился бесконечный цикл. Ошибку я искал три дня. Каково?
А на Паскале я выловил бы ее мгновенно и без малейшего напряга.
← →
Тимохов © (2004-04-07 19:41) [263]
> Fantasist © (07.04.04 19:34) [261]
Ну хоть кто-то поддержал, что это тоже вариант :)))))
Ну Public. В чем проблема - делаете конструтор create в нем сразу raise .... Делаете другой конструктор private constructor Internalcreate. И все.
Метод, конечно дурацкий, но все же рабочий.
> Юрий Зотов © (07.04.04 19:34) [262]
Да нет - паскаль я люблю больше всего.
Просто я из любого языка стараюсь вырезать то, что по моему отвечает духу надежного программирования в наибольшей мере. Все, что не отвечает - не использую. Не хотелось бы услышать критику на последнее высказывание - тогда этот топик сильно разрастется, а каждый отстанется при своем мнении...
← →
Fantasist © (2004-04-07 19:47) [264]
> Ну хоть кто-то поддержал, что это тоже вариант :)))))
Скоро традицией у меня станет вас поддерживать. :)
> Ну Public. В чем проблема - делаете конструтор create в
> нем сразу raise ....
Это тогда вариант 2, который еще хуже, чем 1.
← →
Тимохов © (2004-04-07 19:51) [265]
> Fantasist © (07.04.04 19:47) [264]
имхо не хуже, а не красивее.
вариант 1 - лучший.
>>>>>>Юрий Зотов
Скажите, все-таки, что вы ожидали услышать в ответе на этот вопрос (про создание одного экз. класса)? Вернее, какой ответ для вас был бы сигналом, что человек заслуживает внимания?
← →
Gamlet © (2004-04-07 21:03) [266]Удалено модератором
← →
Cobalt © (2004-04-07 21:27) [267]Вопрос к Юре Зотову - что Вы скажете насчёт моего объяснения про OnCreate (http://delphimaster.net/view/14-1081088912/ ответ №187)
" - Я пг"ав или не пг"ав???"
← →
Style © (2004-04-07 21:27) [268]
> Юрий Зотов © (07.04.04 19:19) [258]
> > Style © (07.04.04 19:13) [255]
>
> Чтобы понять все до конца, повторите то же самое, что Вы
> делали в [248], но только возмите A типа Cardinal и равное
> $ABCD. А при анализе результатов смотрите R в виде HEX и
> вспомните тот самый вопрос 1.1.
> :о)
type
TRange = 1..256;
var
a: cardinal;
R: TRange;
begin
a := $ABCD;
r := a;
Caption := IntToHex(r,2);
Ну у меня r все равно ABCD??? В чем подвох??
Вы наверное хотели сказать о том что в памяти ABCD выглядит как CDAB??
← →
Cobalt © (2004-04-07 21:36) [269]А как же второй вариант?
Который с 1..254.
← →
Piter © (2004-04-07 21:38) [270]pasha_golub (07.04.04 16:48) [228]
но я то спрашивал про связку из трех строчек, а не про вырванную из контекста одну.
ну если ты понимаешь каждую из строчек, то почему ты не можешь сказать результат? Просто можно сделать несколько заданий. Типа чему равен High(Integer), потом задать вопрос на приведение типов. Потом задать вопрос по адресации. А Зотов взял и объединил все в двух строчках. Почему нет?
На самом деле, если человек ответил, то, наверное, он не будет задавать вопросов, если в коде встретит выражение
if (a) xor (b)
А я вот что хотел спросить:
Почему в TObject.NewInstance используется некий _GetMem, что это такое?
← →
Style © (2004-04-07 21:51) [271]Ну второй вариант CD
потому что
r приравнивается к byte
и поскольку в памяти все выглядит как CDAB то и берется первый байт.
r = CD
это тоже самое что
I: integer;
i := $ABCD;
i := byte(i);
← →
Игорь Шевченко © (2004-04-07 21:53) [272]
> А я вот что хотел спросить:
> Почему в TObject.NewInstance используется некий _GetMem,
> что это такое?
А это выделение памяти под экземпляр объекта
← →
Piter © (2004-04-07 22:01) [273]Тимохов (07.04.04 17:46) [236]
будет работать и при включенном overflowchecks...
а это ты вообще к чему?
А если так, допустим, в I типа Integer хранится значение $7FFFFFFFPtr:=Pointer(I+1);
Будет работать? А вот если I это LongWord, то будет Это при включенной директиве. При выключенной я уже говорил, что разницы нет, зря Verg возмущается...
Verg (07.04.04 18:34) [243]
Начни с постановки вопроса
а это здесь причем. Я говорил про твою фразу, что нельзя Integer(@...) использовать...
← →
Verg © (2004-04-07 22:07) [274]Piter © (07.04.04 22:01) [273]
А я спрашивал как сравнить два A, и B : pointer;
A > B
Я не про САМ ФАКТ преобразования pointer к integer как такового, а про корректность полученного результата...
Ты сможешь сделать полнофункциональной ту ф-цию? Хоть с rangecheck, хот без оного?
← →
Piter © (2004-04-07 22:11) [275]Игорь Шевченко (07.04.04 21:53) [272]
А это выделение памяти под экземпляр объекта
Я так и знал... :)))
Но почему не GetMem?
← →
Piter © (2004-04-07 22:25) [276]Verg (07.04.04 22:07) [274]
А я спрашивал как сравнить два A, и B : pointer
сравнивать два Pointer"а ? А зачем? Ну если надо
LongWord(A) > LongWord(B)
если я тебя правильно понял...
← →
Verg © (2004-04-07 22:37) [277]
> LongWord(A) > LongWord(B)
Нет, Piter, - ты хитрэц, "Уж", так сказать :))
То ты про Integer(pointer), тот ты про LongWord(pointer).
Нет уж ты уж скажи сначала - корректно ли, все же, преобразовывать pointer к integer, хотя как ты сам сказал, pointer - это вообще не....?
Что там? (Это насчет high(pointer))
> сравнивать два Pointer"а ? А зачем? Ну если надо
Я тоже не спрошу зачем прибавлять к поинтеру некоторе число (почему-то два, а не sizeof(I) div 2), приводя тот самый поинтер предварительно к integer-у, как в тесте. Почему-то не к cardinal и не к pchar.
← →
Игорь Шевченко © (2004-04-07 22:45) [278]Piter © (07.04.04 22:11)
> Но почему не GetMem?
Потому что это одно и тоже :)
← →
Piter © (2004-04-08 00:44) [279]Verg (07.04.04 22:37) [277]
корректно ли, все же, преобразовывать pointer к integer
абсолютно корректно. Сложение как Integer"а тоже корректно (именно это было в задании ЮЗ, почему я и сказал), если нет директивы упомянутой. Если она есть - то может возникнуть исключение при "перепрыгивании" из положительного диапазона в отрицательный (что не так и вероятно).
Verg (07.04.04 22:37) [277]
Я тоже не спрошу зачем прибавлять к поинтеру некоторе число
например, чтобы узнать адрес нужного смещения. Допустим, ты хочешь узнать количество ссылок в структуре AnsiString - как ты это реализуешь, интересно? Если не операциями с адресами...
Игорь Шевченко (07.04.04 22:45) [278]
Потому что это одно и тоже :)
ну а почему все таки не просто GetMem? Ничего не бывает просто так...
← →
Verg © (2004-04-08 06:27) [280]
> Piter © (08.04.04 00:44) [279]
> Verg (07.04.04 22:37) [277]
> корректно ли, все же, преобразовывать pointer к integer
>
> абсолютно корректно.
Но, тем не менее, сам почему-то написал longword(A), а не integer в [276].....
Думаем одно, а говорим другое?
← →
MBo © (2004-04-08 06:39) [281]>ну а почему все таки не просто GetMem
Когда ты пишешь GetMem (что удобнее программисту), компилятор подставляет вызов функции_GetMem, а в исходниках VCL разработчикам было все равно, как писать.
← →
Verg © (2004-04-08 06:42) [282]И вот еще, что....
Piter, чтобы задача не казалась для тебя абстрактной, напиши на Паскале (на Дельфи), например, реализацию ф-ции Move.
← →
Alex Konshin © (2004-04-08 06:56) [283]GetMem - процедура.
_GetMem - функция.
← →
Матлабист (2004-04-08 11:27) [284]> Alex Konshin © (08.04.04 06:56) [283]
А какая разница? Все равно CALL _GetMem. И, кстати, _GetMem использует значение EAX (размер) и устанавливает значение в EAX. Так что по сути это функция.
← →
Игорь Шевченко © (2004-04-08 11:36) [285]Матлабист (08.04.04 11:27)
Alex Konshin © (08.04.04 06:56)
Окно View|CPU нас рассудит.
В скомпилированной программе с вызовом GetMem обращение производится к процедуре _GetMem
← →
Alex Konshin © (2004-04-08 11:41) [286]А чего тут судить - я и сам это знаю. Я просто обратил внимание на разницу, которую все тут искали.
← →
Alex Konshin © (2004-04-08 12:07) [287]Кстати, если уж на то пошло, то в basm это будет выглядеть как System.@GetMem, а не _GetMem.
Я ее использовал в своих Arrays, кстати, именно в подмене NewInstance.
← →
Piter © (2004-04-08 19:46) [288]Verg (08.04.04 06:27) [280]
> абсолютно корректно.
Но, тем не менее, сам почему-то написал longword(A), а не integer в [276].....
такое очучение, что ты не читаешь другие слова. Я ж тебе сказал, что преобразование корректно! Корректное преобразование, это когда ты можешь однозначно обратно вернуть.
А вот сложение в рамках Integer не совсем корректно! Понимаешь? Об этом я и говорю. СЛОЖЕНИЕ НЕ ВСЕГДА КОРРЕКТНО
← →
Piter © (2004-04-09 19:21) [289]?
← →
kaif © (2004-04-10 00:33) [290]А как в свете сказанного происходила эволюция типов Object Pascal от одной версии Delphi до другой?
Ведь в начале (если я не ошибаюсь), под integer понималось одно, а под longint - другое? А потом это стало 4 байта. Завтра это может стать 64bit-а... Я не исключаю, что int64 и integer станут синонимами на 64-разрядной системе. Хотя пока трудно что-то сказать... То же самое касается и типа string, который вначале (я опять боюсь ошибиться) был длиной 255 символов, а в первом байте хранилась его длина. Затем string стал длиной в то, что помещается в 4 байта и в каком-то смысле совместимым с PChar. А shortstring заменил старый string.
Я, например, несколько побаиваюсь конструкций типа High(integer). Скорее всего это оттого, что я прикладной программист, а не настоящий. Но все же... Не проще ли записать
const
max_buff_size = столько-то,
чем использовать всякие High ?
-----------------
Я лично редко использую High. Возможно, я неправ.
-----------------
Если что-то переврал из истории развития типов - поправьте, но ногами не бейте. :)
← →
Игорь Шевченко © (2004-04-10 00:49) [291]
> Я не исключаю, что int64 и integer станут синонимами на
> 64-разрядной системе.
И станут. Другое дело, что если не использовать конструкции вида SizeOf(Integer) или SizeOf(переменная типа Integer), то разрядность типа Integer не должна служить причиной проблем в существующих программах.
> Я лично редко использую High. Возможно, я неправ
type
TMyColor = (mcForm, mcHeader, mcDetail, mcFocus)
var
Colors: array [TMyColor] of TColor;
I: TMyColor;
begin
for I:=Low(TMyColor) to High(TMyColor) do
Colors[I] := clWhite;
end;
По-моему, Low и High в этом примере - наилучшее решение.
← →
kaif © (2004-04-10 02:29) [292]2 Игорь Шевченко © (10.04.04 00:49) [291]
:)))
Вы - телепат. Это именно тот редкий случай (перебор перечислимых типов), где я использую High! Я сначала даже так и написал в своем постинге (кроме перечислимых типов), но потом побоялся, что заклюют и стер... Еще я иногда использую их при работе с массивами. Но размерности массивов все же определяю в обычных константах...
Страницы: 1 2 3 4 5 6 7 8 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 1.51 MB
Время: 0.047 c