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

Вниз

Маленький тест Delphi программиста для Yandex   Найти похожие ветки 

 
Baks   (2012-08-28 20:35) [0]

Вот, на Yandex требуется Delphi программист и для него есть три вопроса с кодом. Как ответите на них?

Вопрос 1 Всегда ли будет корректно работать приведенный код?

type
PSomeRecord = ^TSomeRecord;
TSomeRecord = record
F1: Byte;
F2: DWORD;
end;

function GetSomeRecord: PSomeRecord;
var
A: Byte;
B: DWORD;
begin
A := 1;
B := 2;
GetMem(Result, SizeOf(A) + SizeOf(B));
Result^.F1 = A;
Result^.F2 = B;
end;

Вопрос 2 Всегда ли функция GetMonotoniousTime будет выдавать монотонный отсчет времени?

var
LastTime: TDateTime = 0;

function GetMonotoniousTime: TDateTime;
var
SysTime: TSystemTime;
begin
GetSystemTime(SysTime);

Result := SystemTimeToDateTime(SysTime);

if Result = LastTime then
Result := Result + 1;

LastTime := Result;
end;

Вопрос 3 Всегда ли правомерен и безопасен приведенный код:

procedure Foo(Args: array of string);
var
I: Cardinal;
begin
for I := Low(Args) to High(Args) do
Windows.MessageBox(0, PChar(Args[I]), nil, 0);
end;

http://company.yandex.ru/job/vacancies/application_programmer_yamoney.xml


 
Rouse_ ©   (2012-08-28 20:41) [1]

нет на все три


 
Sha ©   (2012-08-28 20:43) [2]

вопросы на знание самых основ, миллион раз обсуждалось


 
Baks   (2012-08-28 21:04) [3]


> нет на все три


А подробнее?


 
Rouse_ ©   (2012-08-28 21:17) [4]

Да чего там подробнее то?
1. запись не упакована, стало быть размер записи не равен сумме размеров ее элементов
2. винда не система реального времени
3. при пустом массиве будет попытка обращения к несуществующему нулевому  элементу


 
Baks   (2012-08-28 21:45) [5]


> при пустом массиве будет попытка обращения к несуществующему
> нулевому  элементу


А как же  for I := Low(Args) to High(Args) do  разве цикл будет выполняться при пустом массиве?


 
Rouse_ ©   (2012-08-28 21:52) [6]

а что ему помешает?


 
Baks   (2012-08-28 22:04) [7]


> а что ему помешает?


Если в Args 0 элементов, то High(Args) должен вернуть -1. Разве нет?


 
Inovet ©   (2012-08-28 22:07) [8]

> [7] Baks   (28.08.12 22:04)
> High(Args) должен вернуть -1

I: Cardinal;


 
Baks   (2012-08-28 22:11) [9]


> I: Cardinal;


Аааа, не обратил внимания. Теперь конечно, понятно.


 
antonn ©   (2012-08-28 23:31) [10]


> Inovet ©   (28.08.12 22:07) [8]
>
> > [7] Baks   (28.08.12 22:04)
> > High(Args) должен вернуть -1
>
> I: Cardinal;

результат же high вернет, причем тут переменная счетчика? просто выполнится от нуля до нуля один раз, если не ошибаюсь


 
Baks   (2012-08-29 00:43) [11]


> просто выполнится от нуля до нуля один раз


Как же от 0 до 0 если High должна вернуть -1 ?


 
antonn ©   (2012-08-29 00:50) [12]

хм, не учел такого момента, результат функции приводится к типу счетчика, подумал было что обе фунции вернут 0 и потому будет ошибка


 
Германн ©   (2012-08-29 01:56) [13]


> antonn ©   (29.08.12 00:50) [12]
>
> хм, не учел такого момента, результат функции приводится
> к типу счетчика

Это такой баян, который ты никак не мог не увидеть раньше!
Вот
> Sha ©   (28.08.12 20:43) [2]
>
> вопросы на знание самых основ

сказал. И это именно так. Компилятор уже с времён царя Гороха предупреждает, что в качестве переменной цикла нужно использовать локальную переменную типа Integer.


 
Германн ©   (2012-08-29 01:59) [14]

Вот только на кой ляд Яндексу требуется программист на Дельфи я так и не понял.


 
antonn ©   (2012-08-29 02:04) [15]


> Это такой баян, который ты никак не мог не увидеть раньше!
>  

Точно помню что тут обсуждали что-то с тестов, потому как вопрос с упакованной записью узнал (я на него и так ответил без обсуждений), а само обсуждение не читал потому как оно быстро скатывается в своеобразный местный фольклор, проматываю.
А в коде своем я не допускаю такие конструкции, если честно я бы даже с integer сделал бы перед циклом перепроверку в предложенной процедуре (вообще там может быть больше maxint элементов в массиве? для чего еще можно поставить dword в счетчик)


 
Германн ©   (2012-08-29 02:08) [16]


> А в коде своем я не допускаю такие конструкции, если честно
> я бы даже с integer сделал бы перед циклом перепроверку
> в предложенной процедуре (вообще там может быть больше maxint
> элементов в массиве? для чего еще можно поставить dword
> в счетчик)

С Integer такую проверку делать не надо. Разве только для перестраховки.
А вот использование беззнакового целого в качестве переменной цикла обсуждалось уже туеву хучу раз.


 
Германн ©   (2012-08-29 02:16) [17]

И кстати легко понять зачем нужно для переменной цикла использовать обязательно "знаковое целое". Чтобы были возможны все три варианта цикла:
1. Стандартное. Цикл выполняется заданное n раз;
2. Цикл выполняется только один раз;
3. Цикл не выполняется ни разу.


 
Inovet ©   (2012-08-29 11:20) [18]

> [15] antonn ©   (29.08.12 02:04)
> если честно я бы даже с integer сделал бы перед циклом перепроверку
> в предложенной процедуре

Ага, монашка тоже презерватив на свечку надевала.


 
Inovet ©   (2012-08-29 11:22) [19]

> [17] Германн ©   (29.08.12 02:16)
> 2. Цикл выполняется только один раз;

Так, а это чем от 1 отличается?


 
Дмитрий С ©   (2012-08-29 11:39) [20]


> Вопрос 2 Всегда ли функция GetMonotoniousTime будет выдавать
> монотонный отсчет времени?
>
> var
> LastTime: TDateTime = 0;
>
> function GetMonotoniousTime: TDateTime;
> var
> SysTime: TSystemTime;
> begin
> GetSystemTime(SysTime);
>
> Result := SystemTimeToDateTime(SysTime);
>
> if Result = LastTime then
> Result := Result + 1;
>
> LastTime := Result;
> end;
>

Кто может объяснить что вообще требуется от этой функции?


 
Inovet ©   (2012-08-29 12:14) [21]

> [20] Дмитрий С ©   (29.08.12 11:39)
> Кто может объяснить что вообще требуется от этой функции?

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


 
KSergey ©   (2012-08-29 12:16) [22]

> Дмитрий С ©   (29.08.12 11:39) [20]

Подозреваю основной "подвох" здесь про то, что две double переменные сравниваются простым сравнением, ну и что время представлено дробной частью в принципе.
Хотя смысла функции лично я тоже не понимаю. Что есть "MonotoniousTime"?

А как понять

> Rouse_ ©   (28.08.12 21:17) [4]
> 2. винда не система реального времени

это моего дзена не хватает даже близко.


 
Inovet ©   (2012-08-29 12:21) [23]

> [22] KSergey ©   (29.08.12 12:16)
> А как понять
>
> > Rouse_ ©   (28.08.12 21:17) [4]
> > 2. винда не система реального времени
>
> это моего дзена не хватает даже близко.

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


 
Inovet ©   (2012-08-29 12:25) [24]

> [23] Inovet ©   (29.08.12 12:21)

Вот RT-11
http://ru.wikipedia.org/wiki/RT-11

И вообще
http://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8


 
Давайте будем жрать!   (2012-08-29 12:28) [25]


> 2. винда не система реального времени
Так вроде x86 со своим SMM and so on вообще не система реального времени, не? ;-)

ЗЫ. В Крыму хорошо, а дома лучше.


 
Дмитрий С ©   (2012-08-29 12:40) [26]


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

Монотонный, это значит невозрастающий или неубывающий. Эта функция немонотонная, и интервалы времени тут не причем, ровно как и время ее работы.


 
KSergey ©   (2012-08-29 12:48) [27]

> Inovet ©   (29.08.12 12:21) [23]

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


 
Inovet ©   (2012-08-29 13:11) [28]

> [27] KSergey ©   (29.08.12 12:48)
> вы хотите сказать, она начнет выдавать мононно изменяющееся время??

Я написал, что есть ОСРВ, а про функцию

> [21] Inovet ©   (29.08.12 12:14)
> Типа генератора уникальных значений, другие применения от меня скрыты.


 
картман ©   (2012-08-29 13:12) [29]


> Дмитрий С ©   (29.08.12 12:40) [26]


>  Эта функция немонотонная,

http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%82%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F


>
> Вопрос 2 Всегда ли функция GetMonotoniousTime будет выдавать
> монотонный отсчет времени?

да


 
antonn ©   (2012-08-29 13:23) [30]


> Ага, монашка тоже презерватив на свечку надевала.

чтобы заразу не занести, вероятно.
вменяемые способы донесения информации - приветствуются


 
Inovet ©   (2012-08-29 14:04) [31]

> [30] antonn ©   (29.08.12 13:23)
> вменяемые способы донесения информации - приветствуются

Что даст проверка перед циклом, если она есть в цикле?


 
antonn ©   (2012-08-29 14:26) [32]


> Что даст проверка перед циклом, если она есть в цикле?

даст возможность избежать ошибки при использовании счетчиком unsigned, дело привычки


 
Anatoly Podgoretsky ©   (2012-08-29 14:32) [33]

> antonn  (29.08.2012 14:26:32)  [32]

А не надо использовать unsigned


 
KSergey ©   (2012-08-29 14:38) [34]

> картман ©   (29.08.12 13:12) [29]
> > Вопрос 2 Всегда ли функция GetMonotoniousTime будет выдавать
> > монотонный отсчет времени?
>
> да

Неправда.
TDateTime - это Double, где целая часть - номер дня.


 
KSergey ©   (2012-08-29 14:41) [35]

> Inovet ©   (29.08.12 13:11) [28]
> > [27] KSergey ©   (29.08.12 12:48)
> > вы хотите сказать, она начнет выдавать мононно изменяющееся
> время??
>
> Я написал, что есть ОСРВ, а про функцию

И как это относится к непониманию в

> KSergey ©   (29.08.12 12:16) [22]

??

А, вы наверное подумали, что я не в курсе названия про реал-тайм ОС? нет, названия такого я в курсе,  я не понимаю как упоминание этого названия  соотносится с исходным вопросом.


 
Sha ©   (2012-08-29 14:51) [36]

> даст возможность избежать ошибки при использовании счетчиком unsigned

for i:=1 to Length() do


 
KSergey ©   (2012-08-29 14:54) [37]

> antonn ©   (29.08.12 14:26) [32]
> > Что даст проверка перед циклом, если она есть в цикле?
> даст возможность избежать ошибки при использовании счетчиком
> unsigned, дело привычки

А вот это вопрос. Вернее не вопрос в смысле что сравнение Signed и Unsigned документировано (что к чему приведется), но в общем случае не факт, что поможет.


 
antonn ©   (2012-08-29 14:55) [38]

я считаю что меня поняли


 
Inovet ©   (2012-08-29 14:59) [39]

> [35] KSergey ©   (29.08.12 14:41)
> что я не в курсе названия про реал-тайм ОС? нет, названия такого я в курсе

И и не сомневался.

ПС. Когда мы перешли на "Вы"?


 
KSergey ©   (2012-08-29 14:59) [40]

> antonn ©   (29.08.12 14:55) [38]
> я считаю что меня поняли

Эта пять!


 
картман ©   (2012-08-29 15:45) [41]


>  KSergey ©   (29.08.12 14:38) [34]


> Неправда.
> TDateTime - это Double, где целая часть - номер дня.

ага, бес попутал, чет подумалось, что 1 - миллисекунда



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

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

Наверх




Память: 0.56 MB
Время: 0.073 c
15-1340195353
xss22
2012-06-20 16:29
2013.03.22
ziptv для XE


2-1335471178
SIV5000
2012-04-27 00:12
2013.03.22
Меню > Создать


2-1332353988
Pcrepair
2012-03-21 22:19
2013.03.22
Тип переменной для СТЕКа в Delphi. что выбрать?


15-1347443626
KSergey
2012-09-12 13:53
2013.03.22
Сроки рассмотрения вариантов перевода для MSDN


15-1351492704
oldman
2012-10-29 10:38
2013.03.22
Задачка. Ответа я не знаю.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский