dlinyj: (Default)
[personal profile] dlinyj
Поскольку в ближайшее время мне вряд ли представится возможность сесть за комп, по сему по просьбам трудящихся сразу напишу пост о вопросах на собеседовании в Samsung

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

I. На знание СИ. Что означают следующие записи:

  1. const char * str;

  2. char const * str;

  3. const * char str;

  4. char * const str;

  5. const char const * str;


(скажу сразу, что я мог уже что-то подзабыть и от общей усталости что-то напутать, но было как-то так).

Скажу сразу что с задачей этой я слажал по крупному, максимально как можно было слажать. Хотя указатели хоть как-то да и понимаю.

II.На знание многозадачного си под linux Следующий вопрос меня поставил в тупик.

...
int main ()
{
       fprintf(0,"hello\n");
       fork();
       return(0);
}


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

III. На сообразительность.

Имеется палка длинной один метр. На неё случайным образом падают десять муравьёв, которые ползут в разные стороны. Скорость движения одного муравья - 1 м/с. В случае если муравей встречается с другим муравьём, то он разворачиватся и ползёт в противоположную сторону. Какое максимальное время нужно прождать, чтобы все муравьи упали с палки.

Честно говоря моя логика подсказывает это число равно двум секундам. Но меня смущает броуновское движение на палке...

Приветствуются ваши варианты ответов.

Date: 2012-08-09 09:32 pm (UTC)
From: [identity profile] guman0id.livejournal.com
fprintf(0,"hello\n"); // тут первый аргумент — файловый стрим

Date: 2012-08-09 09:36 pm (UTC)
From: [identity profile] guman0id.livejournal.com
Он равен нулю, поэтому в него не получится писать.
При чём тут fork не знаю, упасть должно сразу на fprintf.

Date: 2012-08-09 09:37 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Это запись в стандартный поток вывода. Должно работать, ИМХО.

Date: 2012-08-09 09:39 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Хотя ты прав

Стандартный ввод

Поток номер 0 (stdin) зарезервирован для чтения команд пользователя или входных данных.
При интерактивном запуске программы по умолчанию нацелен на чтение с устройства текстового интерфейса пользователя (клавиатуры). Командная оболочка UNIX (и оболочки других систем) позволяют изменять цель этого потока с помощью символа «<». Системные программы (демоны и т. п.), как правило, не пользуются этим потоком.

Date: 2012-08-09 09:44 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Однако, когда ставлю 0, компилируется, а когда 1 ругается. Но и так и так даст ошибку сегментирования.

Date: 2012-08-09 10:02 pm (UTC)
From: [identity profile] juunitaki.livejournal.com
0, 1, 2 можно передавать в системный вызов write. fprintf - функция стандартной библиотеки С и принимает на вход аргумент типа FILE * (указатель на файл). То есть

fprintf(0, "blabla) это тоже самое, что fprintf(NULL, "blabla"), что бессмысленно. А вот заранее определенные переменные stdin, stdout и stderr как раз являются валидными указателями на FILE и их можно было бы использовать.

Date: 2012-08-09 10:10 pm (UTC)
From: [identity profile] juunitaki.livejournal.com
write принимает аргументов файловый дескриптор, который в unix представляется целым числом. Дескриптор и стрим - разные вещи.

Есть функция fdopen, которая создает стрим на основе существующего дескриптор, который может быть стандартным вводом/выводом/потоком ошибок, пайпом, файлов, открытым функцией open (а не fopen!), а может быть, например, сокетом. В полученный стрим уже можно писать fprintf'ом по шаблону, например, и этот поток уже может, например, построчно буферизироваться. То есть на 10 fprintf'ов будет вызван один write. Но это уже тонкости.

Date: 2012-08-10 05:48 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Спасибо за развёрнутый ответ!

Date: 2012-08-10 06:53 am (UTC)
From: [identity profile] maddev.livejournal.com
> Однако, когда ставлю 0, компилируется, а когда 1 ругается.
0 синтаксически эквивалентно NULL (пустой указатель), который и определен где-то как 0. Ну, то есть 0 — это не только лексема целого, но и лексема нулевого указателя.
1 — это целое число, оно не может быть неявно преобразовано в указатель.

Date: 2012-08-10 06:55 am (UTC)
From: [identity profile] maddev.livejournal.com
Это в C++. В Си 0 всегда будет только числом.

Date: 2012-08-09 09:45 pm (UTC)
From: [identity profile] king2.livejournal.com
Ошибку оно выдаст, потому что попытается сдохнуть при живом форкнутом потомке.

Date: 2012-08-10 05:47 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Нет, выше уже показали. Если убрать fprintf(0,...); то тогда всё работает на ура. Даже если поставить просто printf

Date: 2012-08-09 10:44 pm (UTC)
From: [identity profile] gorl.livejournal.com
ну, с указателями все очевидно, а задача про муравьев класс.
само собой они все попадают за одну секунду, а почему - предлагаю решить твоим читателям)

Date: 2012-08-10 12:48 am (UTC)
From: [identity profile] nosferatum.livejournal.com
последняя - 1 секунда. муравьи разворачиваются при столкновении = муравьи проползают сквозь друг друга

Date: 2012-08-10 05:14 am (UTC)
From: [identity profile] nemo-q.livejournal.com
эм, а если он начинает ходить по кругу, поперек палки, то тогда сколько? :)

Date: 2012-08-10 05:23 am (UTC)
From: [identity profile] nosferatum.livejournal.com
поперек -это как? тогда он свалится сразу

Date: 2012-08-10 05:32 am (UTC)
From: [identity profile] nemo-q.livejournal.com
В моем понимании палка деревяная и на практике чтоб муравей с нее упал надо постараться.
Немного развив тему, он может "зависнуть" в процессе поиска пути и тыкаться поперек нее чувствуя угрозу свалиться.

Ну это я так, развиваю тему :)

Date: 2012-08-10 05:16 am (UTC)
From: [identity profile] mbr.livejournal.com
Подозреваю, что в первом вопросе №5 должно быть const char *const, иначе как же не завалить стандартным вопросом про константные указатели на константные данные :)

3 - одна секунда - я начинал считать от 2 муравьев, стартующих с разных концов палки. Хотя, идея с переползанием, безусловно, проще :)

Date: 2012-08-10 05:48 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Да-да-да! Но я на него ответил, не уверен что правильно: константный указатель на константные данные :)...

С переползанием гениально!

Date: 2012-08-10 06:29 am (UTC)
From: [identity profile] cluster-d.livejournal.com
А во второй задаче строки в fprintf и fork точно не наоборот были?

Date: 2012-08-10 06:39 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Точно!

Date: 2012-08-10 07:06 pm (UTC)
From: [identity profile] free-artp.livejournal.com
Ленивые они, в самсунге. Этот список вопросов мы давали в 2000 году. А принесли его мне студенты из Политеха. Это стандартный тест, кажется, от М$.

Date: 2012-08-10 07:33 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Где б его целиком найти?

Date: 2015-02-26 11:29 pm (UTC)
From: [identity profile] Юля Матисова (from livejournal.com)
А Вам какое-то задание домой давали решать?

Date: 2015-03-03 08:40 am (UTC)

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 09:42 am
Powered by Dreamwidth Studios