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

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

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

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

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

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

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

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

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

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

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

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

Date: 2013-05-13 11:25 am (UTC)
From: [identity profile] mopexod.livejournal.com
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", но про одинаковость - ни слова.

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

Параграф '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", но про одинаковость - ни слова.

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

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

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

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2013-05-13 02:42 pm (UTC) - Expand

(no subject)

From: [identity profile] mopexod.livejournal.com - Date: 2013-05-13 03:18 pm (UTC) - Expand

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

June 2025

S M T W T F S
123 4 5 6 7
8 910 11 12 13 14
15 16 17 1819 20 21
22 23 24 25 26 27 28
29 30     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 1st, 2025 01:44 pm
Powered by Dreamwidth Studios