avva: (moose)
avva ([personal profile] avva) wrote2013-05-13 01:17 am

альтернатива физзбаззу

Цитирую из подзамочной записи с разрешения автора, который работает в американской компании и интервьюирует программистов:
Интесная закономерность выявляется. Мы начинаем интервью с того, что просим кандидата прочитать вот такой код, и сказать, что он делает. Как бы он назвал эту функцию?

private static int ok(int a, int b) {
   while (a >= b) a -= b;
   return a;
}

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

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 06:13 am (UTC)(link)
Частично в тему: недавно видел где-то задание написать memmove() на полностью стандартном, абсолютно переносимом C. Кто думает, что знает — не спешите, задачка с подковыркой.

[identity profile] gineer.livejournal.com 2013-05-13 07:10 am (UTC)(link)
да ясно в чем подковырка -- в случае если области памяти пересекаются

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 09:29 am (UTC)(link)
Это только начало подковырки, краешек.

[identity profile] mopexod.livejournal.com 2013-05-13 08:32 am (UTC)(link)
О, кстати неплохая идея. Помимо пересекающихся областей памяти, еще и базовые типы неизвестной длины.

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 09:30 am (UTC)(link)
Ну, memmove копирует байты, по определению. Та что с типами как раз проблем нет.

[identity profile] mopexod.livejournal.com 2013-05-13 10:01 am (UTC)(link)
В кондовом стандартном С нету байтов :(

http://en.wikipedia.org/wiki/C_data_types

[identity profile] vrml.livejournal.com 2013-05-13 10:38 am (UTC)(link)
В качестве байтов всегда использовались char.

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 10:59 am (UTC)(link)
Есть. Читайте не википедию, а стандарт ;)

[identity profile] mopexod.livejournal.com 2013-05-13 11:25 am (UTC)(link)
http://flash-gordon.me.uk/ansi.c.txt

Параграф '3.1.2.5 Types' (вообще не упоминает слово byte):
An object declared as type char is large enough to store any member of the basic execution character set.

Параграф '1.6 DEFINITIONS OF TERMS':
Byte --- the unit of data storage in the execution environment large enough to hold any member of the basic character set of the execution environment.

Каждый из них "large enough", но про одинаковость - ни слова.

[identity profile] mopexod.livejournal.com 2013-05-13 11:27 am (UTC)(link)
*** ссылка на стандарт убрана из-за спамоловки ***

Параграф '3.1.2.5 Types' (вообще не упоминает слово byte):
An object declared as type char is large enough to store any member of the basic execution character set.

Параграф '1.6 DEFINITIONS OF TERMS':
Byte --- the unit of data storage in the execution environment large enough to hold any member of the basic character set of the execution environment.

Каждый из них "large enough", но про одинаковость - ни слова.

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 01:09 pm (UTC)(link)
Байт ― не тип, а единица памяти, верно. Sizeof возвращает количество этих единиц. Размер типа char в этих единицах ― 1.

[identity profile] mopexod.livejournal.com 2013-05-13 01:40 pm (UTC)(link)
Со всем согласен. Только гарантии на последнее утверждение стандарт не даёт. Хотя имплементаций, где бы это было не так, не видел ни разу, и не помню что читал о таких.

[identity profile] mopexod.livejournal.com 2013-05-13 01:46 pm (UTC)(link)
Начиная со стандарта С99 это установлено. До того, насколько я понимаю, - нет.

(no subject)

[identity profile] mopexod.livejournal.com - 2013-05-13 15:18 (UTC) - Expand

[identity profile] blacklion.livejournal.com 2013-05-13 11:28 am (UTC)(link)
Проблема, кажется, в том, что по стандарту мы имеем право сравнивать на больше-меньше только указатели, которые указывают внутрь одного объекта, нет?
Т.е. вообще-то, указатели, которые получены от двух вызовов malloc()'а в совсем-совсем стандартном C не имеют отношения порядка между собой.
Стандарт разрешает сравнивать только пойнтеры, которые указывают в одну структуру или массив...

Так что получается, что такой memmove() не очень-то реализуем — мы не можем быть уверены, что мы вообще можем сравнить два переданных нам указателя. Точнее — можем, но можем получить undefined result, который в стандартном C никак не обработать.

И реализация memmove() для какой-нибудь теговой архитектуры потребует обращения к платформо-специфичным средствам определения, одному ли объекту принадлежат указатели.
Edited 2013-05-13 11:30 (UTC)

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 01:10 pm (UTC)(link)
Верно. Но реализовать все же можно.

[identity profile] cmm.livejournal.com 2013-05-13 02:51 pm (UTC)(link)
даже на ZetaC?

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 03:13 pm (UTC)(link)
Погуглил данный термин, ничего подходящего не нашел. Это какая-то суперстандартная или, наоборот, супернестандартная реализация?
Edited 2013-05-13 15:14 (UTC)

[identity profile] cmm.livejournal.com 2013-05-13 05:23 pm (UTC)(link)
и правда не гуглится от слова вообще, что впрочем нисколько не удивительно.
это такая реализация C, написанная в позапрошлом веке для лисп-машин, исключительно ради компиляции X.  X, говорят, даже компилировался и работал.

так вот со сравнимостью указателей в разные объекты там было то самое, предусмотренное стандартом.

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 06:06 pm (UTC)(link)
Ну если других препятствий нет, то да, вполне ;) Вообще-то решение тупое до невозможности, может быть, поэтому его не сразу видно.

[identity profile] cmm.livejournal.com 2013-05-13 06:59 pm (UTC)(link)
ну если проверка равенства гарантированно работает, тогда понятно.

[identity profile] blacklion.livejournal.com 2013-05-13 05:23 pm (UTC)(link)
А как, кстати? Я вот, кажется, чего-то не вижу. Через сравнение на равенство? Т.е. сначала пробежать по и поискать нет ли где-то равенства, и если есть, то это пересечение?
Я вот не помню, гарантирует ли нам стандарт хотя бы сравнение на равенство двух произвольных указателей...

[identity profile] cmm.livejournal.com 2013-05-13 05:25 pm (UTC)(link)
я бы на месте стандарта не гарантировал, но проверять лень.
представьте себе, например, сегментированную архитектуру с перекрывающимися сегментами.

[identity profile] blacklion.livejournal.com 2013-05-13 05:26 pm (UTC)(link)
Вот-вот, и я именно об этом. Поэтому я не вижу способа написать правильный memmove(), который будет работать на любой архитектуре.

[identity profile] huzhepidarasa.livejournal.com 2013-05-13 06:13 pm (UTC)(link)
Да, гарантирует, даже на сегментированной архитектуре, иначе было бы совсем-совсем тошно.

"If two pointers point to the same object or function, they compare equal".

[identity profile] blacklion.livejournal.com 2013-05-13 06:14 pm (UTC)(link)
Ну, тогда понятно, как это сделать правильно. Хотя, конечно, никто так не делает.