Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что нужно работодателю? 
:(
    Опции темы
Mayk
  Дата 21.8.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Источник: http://www.gamedev.ru/forum/?action=showto...up=9&topic=1321
--- кусь ---

Damir Tenisheff



Приложение к нитке "Где найти специалистов: Базовый уровень знаний С++".
Непосредственно вопросы:
Итак, вопросы. Полагаю, что писать ответы к ним в этой конференции не требуется. Сразу оговорюсь, что я не претендую на авторство вопросов. Что-то придумал сам по результатам чтения исходников в своей команде, что-то взял с других тестов и книг. Это не все вопросы – я выбрал 10 наиболее показательных. Если интересно – могу привести остальные.




*** 1 ***
Запишите названия типов и прокомментируйте, что в данном случае константно
a) const char *
b) char const *
c) char * const

Классические ошибки:
- Второй вариант почти никто не знает.
- Первый и третий вариант путают постоянно.

Замечание:
Почему-то про int * говорят “указатель на int”, а про char * говорят не “указатель на char”, а «указатель на строку».
Я всё понимаю и это ошибкой не считаю, но это всё же неточность в простом задании.


*** 2 ***

Для типа T напишите объявление следующих методов
a) конструктора копирования
b) оператора присваивания
c) оператора проверки на равенство
d) оператора сложения

Классические ошибки:
- значения передают по значению, а не по ссылкам
- ссылки делают не константными
- проверка на равенство (если делается членом) не объявляется константным методом
- оператор сложения пытается возвращать ссылку

*** 3 ***

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

Классические ошибки:
#define sq(x) x*x
Занавес. И вариации на эту тему.

*** 4 ***
struct A { A(){ cout << "A"; } };
struct B { B(){ cout << "B"; } };
struct C { C(){ cout << "C"; } };
struct D { D(){ cout << "D"; } };
struct E : D { E(){ cout << "E"; } };

struct F : A, B {
C c;
D d;
E e;
F() : B(), A(),d(),c(),e() { cout << "F"; }
};

В каком порядке будут вызваны конструкторы классов при создании объекта типа F ?
Запишите, каким будет при этом вывод программы?

*** 5 ***

Что произойдет в результате выполнения следующего кода? В чем ошибка? Как ее исправить?

T *p = new T[10];
delete p;

Классические ошибки:
- Всё будет хорошо
- Удалится только первый элемент
- Удалится всё, но будет вызван деструктор только первого элемента

*** 6 ***

Что произойдет в результате выполнения следующего кода?
T *p = 0;
delete p;

Классические ошибки:
- Программа упадёт.

Замечание:
Я знаю, что для произвольного типа Т этот вопрос немного сложнее и надо спрашивать о том, не перегружен ли delete у типа Т. Но меня устроил бы простой ответ для POD-типов и пользовательских типов с неперегруженным delete.

*** 7 ***

Что означает запись:
class Foo {
void Bar( void ) const ;
};

Что известно о методе Bar класса Foo?

*** 8 ***

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

Классические ошибки:
- Мне всё время рисуют ОБЫЧНОЕ наследование от ОДНОГО базового класса, имеющего виртуальные функции!!!
- Если кто-то и знает о виртуальном наследовании (1 из 100) – ничего не знает об инициализации в этом случае.

*** 9 ***

В чем состоит потенциальная опасность данного кода:

long value;
…
value &= 0xFFFF;

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

Классические ошибки:
- value &= (long) 0xFFFF;
Занавес.

*** 10 ***

Что делается в следующем примере?
Код

void send (int *to, int * from, int count) 
{ 
  int n = (count + 7) / 8; 
  switch ( count % 8) { 
    case 0:    do  {  *to++ = *from++; 
    case 7:          *to++ = *from++; 
    case 6:          *to++ = *from++; 
    case 5:          *to++ = *from++; 
    case 4:          *to++ = *from++; 
    case 3:          *to++ = *from++; 
    case 2:          *to++ = *from++; 
    case 1:          *to++ = *from++; 
      } while ( --n > 0 ); 
  } 
} 

Зачем кому-нибудь может понадобиться подобный код?
--- кусь ---

Это сообщение отредактировал(а) Mayk - 21.8.2005, 19:58


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
ManiaK
Дата 22.8.2005, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Последний пример я где-то уже встречал, интересно smile
PM MAIL WWW   Вверх
Chaos A.D.
Дата 22.8.2005, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



Как я горд, что знаю про виртуальное наследование smile. На восемь вопросов ответил легко. А вот девятый - не знаю, что там. Может нулей добавить? Я только один раз в жизни использовал битовые маски, по этому, не знаю, что в этом примере не так. Последний пример взят из упражнения второй(или третьей) главы Евангилие от Страуструпа. Так же где-то видел в каких то исходниках. Было бы интересно узнать правильный ответ на последние два вопроса.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
ManiaK
Дата 22.8.2005, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(Mayk @ 21.8.2005, 20:43)
Зачем кому-нибудь может понадобиться подобный код?

Насколько я понимаю хитрость такой пары switch-while в том, что в первом цикле выполнится пересылка только count%8 значений, а во всех остальных циклах (коих либо count/8 при count%8=0 либо count/8 +1 при count%8 != 0) - по восемь значений. Для чего данная конструкция необходимо ответить трудно, я не сталкивался с необходимостью такой записи.
PM MAIL WWW   Вверх
cardinal
Дата 22.8.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Мне кажется, что это просто побайтовое копирование (без какий-либо практической эффективности smile)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Mayk
Дата 22.8.2005, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(cardinal @ 22.8.2005, 13:40)
без какий-либо практической эффективности

Дыкть, это ж Разворачивание Цикла smile Красивый кот, ничего не скажешь.
Цитата(ManiaK @ 22.8.2005, 13:34)
я не сталкивался с необходимостью такой записи.

Угу, memcpy/std::copy рулят smile

Цитата(Chaos @ 22.8.2005, 12:43)
Было бы интересно узнать правильный ответ на последние два вопроса.

Мог бы и по ссылочке сходить. Ну да ладно.
Цитата(Chaos @ 22.8.2005, 12:43)
А вот девятый - не знаю, что там. Может нулей добавить?

Пересказываю ответ: если int не совпадает размером с long, то компилятор может перекастить 0xFFFF в 0xFFFFFFFF(если он считает int знаковым).
(ИМХО плохая задача. ИМХО слишком надуманная - где это видано, чтобы sizeof(int) был равен 16 битам?! Да никогда. Мы не в 20ом веке. Сейчас в 16 бит даже символ может не влезть).


Цитата(Chaos @ 22.8.2005, 12:43)
Я только один раз в жизни использовал битовые маски

smile а как же работа с флагами?


Кстати, а что сошло бы за безопасный макрос на третий вопрос? Ну кроме предполагаемого "я бы использовал inline ф-цию".
Не могу придумать ничего безопаснее
Код

#define sqr(typeof_x, x, resvar) typeof_x resvar=(x); resvar *= resvar;

Но это нельзя подставить в цикл for.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 22.8.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(Mayk @ 22.8.2005, 11:30)
#define sqr(typeof_x, x, resvar) typeof_x resvar=(x); resvar *= resvar;

Интересное решение, но ИМХО бесполезное smile

Без особых изврещение можно написать что-то вроде:
Код
#define sqr(x) ((x)*(x))

Хотя если x -- функция, то тоже не особо smile

Насчёт 9-го. Ну я бы написал
Код

value &= 0xFFFFL;

вроде так... давно на Сях не писал smile

А вот 10-е мне вооще не понятно. Цикл в switch? Надо дома попробовать smile


--------------------
Да. Именно так.
PM   Вверх
Chaos A.D.
Дата 22.8.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



Цитата(Mayk @ 22.8.2005, 10:30)
Цитата (Chaos A.D. @ 22.8.2005, 12:43)
Было бы интересно узнать правильный ответ на последние два вопроса. 

Мог бы и по ссылочке сходить. Ну да ладно.


Я сначала по ссылке пошел, а потом твой пост начал читать. Там ответа на первой странице в вопросом не дали, следующие дальше читать не стал...

Цитата(Mayk @ 22.8.2005, 10:30)
Цитата (Chaos A.D. @ 22.8.2005, 12:43)
Я только один раз в жизни использовал битовые маски

а как же работа с флагами?



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

Кстати, а что есть "Разворачивание Цикла" aka "unrolling loop"?

Это сообщение отредактировал(а) Chaos A.D. - 22.8.2005, 15:31
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Mayk
Дата 22.8.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Chaos @ 22.8.2005, 19:28)
Я сначала по ссылке пошел, а потом твой пост начал читать. Там ответа на первой странице в вопросом не дали, следующие дальше читать не стал

[offtop]и прально, нечего по другим форумам шататься(ответы там были где-то посредине)[/offtop]

Цитата(Chaos @ 22.8.2005, 19:28)
Кстати, а что есть "Разворачивание Цикла" aka "unrolling loop"?

Это когда цикл убирают для повышения быстродействия. То есть был
Код

for(int i=0; i!=4;++i) a[i]=i;

стал
Код

a[0]=0,a[1]=1,a[2]=2,a[3]=3;

Итог - увеличение скорости программы (не надо сравнивать i с 4 и инкриментировать i);
В 10ом примере развернули примерно такой цикл
Код

for(int i=0; i!=8; ++i) to[i]=src[i];


Довольно эффективное средство оптимизации, надо сказать.

Это сообщение отредактировал(а) Mayk - 22.8.2005, 21:09


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 30.8.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Вот еще одна задачка на сообразительность(уж коли начали задачки сюда скидывать, продолжу сию славную традицию).
Есть код
Код

#include <stdio.h>
#include <stdlib.h>

FILE* lastCreatedFile=NULL;

class File{
    protected:    FILE* f;
    
    public:
    File(){f=NULL;}
    File(const char* path, const char* mode){f=fopen(path, mode);    }
    ~File(){if(f) fclose(f);}
};

class OutTextFile : public File{
    public:
    OutTextFile() {}
        OutTextFile(const char* str) : File(str, "w"){}        
        void println(){fprintf(f,"\n");}
};

class LogFile : public OutTextFile{
    public:
    LogFile() : OutTextFile("log.txt"){};
};

void someStuff(){
    LogFile l;
    l.println();
}

int main(){
    someStuff();
    fprintf(lastCreatedFile, "hello world\n");
}

Вы должны сделать так, чтобы в файл log.txt была выведена строка hello world(то есть fprintf в теле main должен быть выполнен). Вы НЕ можете добавлять новые переменные. Вы НЕ можете изменять тела существующих функций/методов. Вы НЕ можете использовать препроцессор(это не интересно). Других ограничений нет smile


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Orlan
  Дата 30.8.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Цитата(Mayk @ 30.8.2005, 17:34)
Вот еще одна задачка на сообразительность(уж коли начали задачки сюда скидывать, продолжу сию славную традицию).
Есть код

Вы должны сделать так, чтобы в файл log.txt была выведена строка hello world(то есть fprintf в теле main должен быть выполнен). Вы НЕ можете добавлять новые переменные. Вы НЕ можете изменять тела существующих функций/методов. Вы НЕ можете использовать препроцессор(это не интересно). Других ограничений нет smile

Другими словами у тебя валится прога при вызове someStuff(); и ты не знаеш почему? smile
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Mayk
Дата 30.8.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Я знаю почему smile
Потому что здесь не дописан кусок кода. Вопрос - какой? smile
Добавлено @ 17:50
Да, кстати. Прога вываливается после someStuff ))
someStuff работает нормально.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 30.8.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Тут ИМХО не совсем корректно.
Я, например, могу вывести "hello world" и не из main, а то что он потом свалится меня не волнует smile
Ведь добавлять новые методы не запрещено? smile


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 30.8.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Нет, надо вывести именно из main.
Цитата
Ведь добавлять новые методы не запрещено?

Запрещено изменять тела существующих ф-ций и добавлять переменные.

Для большей ясности - файл log.txt НЕ должен быть закрыт smile

Блин, не доглядел. Не надо было println делать - дырка )
Переопределять println в LogFile тоже нельзя. А то неинтересно.

Это сообщение отредактировал(а) Mayk - 30.8.2005, 18:05


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 30.8.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



ну взять да деструктор добавить в LogFile
а там сделать LastCreatedFile=f;
если бы он был виртуальным, но надо было бы добавить f=0;...


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2212 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.