<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eabatalov89</id>
		<title>SEWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eabatalov89"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Eabatalov89"/>
		<updated>2026-04-07T23:23:09Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=373</id>
		<title>Участник:Eabatalov89</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=373"/>
				<updated>2011-09-16T17:54:24Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: /* О себе: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Баталов Евгений ==&lt;br /&gt;
&lt;br /&gt;
e-mail: [mailto:eabatalov89@gmail.com eabatalov89@gmail.com]&lt;br /&gt;
&lt;br /&gt;
[[Файл:eabatalov_ava1.jpg]]&lt;br /&gt;
&lt;br /&gt;
* 2006-2010 гг Сургутский Государственный Университет, Факультет Информационных Технологий, АСОиУ.&lt;br /&gt;
* В данный момент СпбАУ SE, 6 курс&lt;br /&gt;
&lt;br /&gt;
== Деятельность: ==&lt;br /&gt;
&lt;br /&gt;
В настоящее время работаю над проектом кафедры МФТИ компании Paralles вместе с Александром Карташовым (SE, 6 курс).&lt;br /&gt;
&lt;br /&gt;
Проект связан с ОС Android, ее виртуализацией, удаленным управлением рабочим столом и в перспективе переносом процессов &amp;quot;в живую&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Год работал с задачами на графах дорог (С++)&lt;br /&gt;
&lt;br /&gt;
В прошлом активно практиковал .NET&lt;br /&gt;
&lt;br /&gt;
Немного писал на Java в небольшом учебном проекте&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== О себе: ==&lt;br /&gt;
&lt;br /&gt;
Люблю С++ и C, Линукс за то что там можно все.  &lt;br /&gt;
&lt;br /&gt;
Люблю консоль за ее простоту и за то что не надо тянуться за мышкой.&lt;br /&gt;
&lt;br /&gt;
Люблю когда люди в команде не держат скелетов в шкафу, понтов или еще чего-то, &lt;br /&gt;
&lt;br /&gt;
когда с ними можно свободно разговаривать, обсуждать, расслаблено, для пользы дела.&lt;br /&gt;
&lt;br /&gt;
Каждого такого человека очень ценю и хочу с такими работать.&lt;br /&gt;
&lt;br /&gt;
Люблю когда в команде есть авторитет, решение которого можно принять в спорных вопросах.&lt;br /&gt;
&lt;br /&gt;
Код должен быть красивым, простым, удобочитаемым, отрефакторенным, соответствующим всем рекомендациям статического анализатора, откомментированым,&lt;br /&gt;
&lt;br /&gt;
но сначала он должен делать то что от него требуется, а все остальное - если есть на это деньги и время.&lt;br /&gt;
&lt;br /&gt;
Вики и трекер спасают проекты! ;)&lt;br /&gt;
&lt;br /&gt;
Люблю сложные штуки и учиться новому. Хотелось бы делать сложные проекты с вызовом к себе и команде.&lt;br /&gt;
Потому подумываю об аспирантуре.&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=372</id>
		<title>Участник:Eabatalov89</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=372"/>
				<updated>2011-09-16T17:45:37Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Баталов Евгений ==&lt;br /&gt;
&lt;br /&gt;
e-mail: [mailto:eabatalov89@gmail.com eabatalov89@gmail.com]&lt;br /&gt;
&lt;br /&gt;
[[Файл:eabatalov_ava1.jpg]]&lt;br /&gt;
&lt;br /&gt;
* 2006-2010 гг Сургутский Государственный Университет, Факультет Информационных Технологий, АСОиУ.&lt;br /&gt;
* В данный момент СпбАУ SE, 6 курс&lt;br /&gt;
&lt;br /&gt;
== Деятельность: ==&lt;br /&gt;
&lt;br /&gt;
В настоящее время работаю над проектом кафедры МФТИ компании Paralles вместе с Александром Карташовым (SE, 6 курс).&lt;br /&gt;
&lt;br /&gt;
Проект связан с ОС Android, ее виртуализацией, удаленным управлением рабочим столом и в перспективе переносом процессов &amp;quot;в живую&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Год работал с задачами на графах дорог (С++)&lt;br /&gt;
&lt;br /&gt;
В прошлом активно практиковал .NET&lt;br /&gt;
&lt;br /&gt;
Немного писал на Java в небольшом учебном проекте&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== О себе: ==&lt;br /&gt;
&lt;br /&gt;
Люблю С++ и C, Линукс за то что там можно все. Люблю сложные штуки и учиться новому. &lt;br /&gt;
&lt;br /&gt;
Люблю консоль за ее простоту и за то что не надо тянуться за мышкой.&lt;br /&gt;
&lt;br /&gt;
Люблю когда люди в команде не держат скелетов в шкафу, понтов или еще чего-то, &lt;br /&gt;
&lt;br /&gt;
когда с ними можно свободно разговаривать, обсуждать, расслаблено, для пользы дела.&lt;br /&gt;
&lt;br /&gt;
Каждого такого человека очень ценю и хочу с такими работать.&lt;br /&gt;
&lt;br /&gt;
Люблю когда в команде есть авторитет, решение которого можно принять в спорных вопросах.&lt;br /&gt;
&lt;br /&gt;
Код должен быть красивым, простым, удобочитаемым, отрефакторенным, соответствующим всем рекомендациям статического анализатора, откомментированым,&lt;br /&gt;
&lt;br /&gt;
но сначала он должен делать то что от него требуется, а все остальное - если есть на это деньги и время.&lt;br /&gt;
&lt;br /&gt;
Вики и трекер спасают проекты! ;)&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=371</id>
		<title>Участник:Eabatalov89</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=371"/>
				<updated>2011-09-16T17:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Баталов Евгений ==&lt;br /&gt;
&lt;br /&gt;
e-mail: [mailto:eabatalov89@gmail.com eabatalov89@gmail.com]&lt;br /&gt;
&lt;br /&gt;
[[Файл:eabatalov_ava1.jpg]]&lt;br /&gt;
&lt;br /&gt;
* 2006-2010 гг Сургутский Государственный Университет, Факультет Информационных Технологий, АСОиУ.&lt;br /&gt;
* В данный момент СпбАУ SE, 6 курс&lt;br /&gt;
Деятельность:&lt;br /&gt;
В настоящее время работаю над проектом кафедры МФТИ компании Paralles вместе с Александром Карташовым (SE, 6 курс).&lt;br /&gt;
Проект связан с ОС Android, ее виртуализацией, удаленным управлением рабочим столом и в перспективе переносом процессов &amp;quot;в живую&amp;quot;.&lt;br /&gt;
Год работал с задачами на графах дорог (С++)&lt;br /&gt;
В прошлом активно практиковал .NET&lt;br /&gt;
Немного писал на Java в небольшом учебном проекте&lt;br /&gt;
&lt;br /&gt;
Люблю С++ и C, Линукс за то что там можно все. Люблю сложные штуки и учиться новому.&lt;br /&gt;
&lt;br /&gt;
Люблю когда люди в команде не держат скелетов в шкафу, понтов или еще чего-то, &lt;br /&gt;
&lt;br /&gt;
когда с ними можно свободно разговаривать, обсуждать, расслаблено, для пользы дела.&lt;br /&gt;
&lt;br /&gt;
Каждого такого человека очень ценю и хочу с такими работать.&lt;br /&gt;
&lt;br /&gt;
Люблю когда в команде есть авторитет, решение которого можно принять в спорных вопросах.&lt;br /&gt;
&lt;br /&gt;
Код должен быть красивым, простым, удобочитаемым, отрефакторенным, соответствующим всем рекомендациям статического анализатора, откомментированым,&lt;br /&gt;
&lt;br /&gt;
но сначала он должен делать то что от него требуется, а все остальное - если есть на это деньги и время.&lt;br /&gt;
&lt;br /&gt;
Вики и трекер спасают проекты! ;)&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,_%D0%B4%D1%80%D1%83%D0%B6%D0%B1%D0%B0&amp;diff=246</id>
		<title>Множественное наследование, дружба</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,_%D0%B4%D1%80%D1%83%D0%B6%D0%B1%D0%B0&amp;diff=246"/>
				<updated>2011-05-19T00:27:23Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: Новая страница: «== Базовые принципы множественного наследования == Расположение классов в памяти при множе…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базовые принципы множественного наследования ==&lt;br /&gt;
Расположение классов в памяти при множественном наследовании. От порядка родителей будет зависеть то, как лежат данные.&lt;br /&gt;
&lt;br /&gt;
[[Файл:img1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct D: A,B,C&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конструкторы, деструкторы ==&lt;br /&gt;
От порядка родителей зависит порядок вызова конструкторов и деструкторов. &lt;br /&gt;
&lt;br /&gt;
Конструкторы: A-&amp;amp;gt;B-&amp;amp;gt;C-&amp;amp;gt;D&lt;br /&gt;
&lt;br /&gt;
Деструкторы: D-&amp;amp;gt;C-&amp;amp;gt;B-&amp;amp;gt;A&lt;br /&gt;
&lt;br /&gt;
== Как использовать множественное наследоание ==&lt;br /&gt;
В основном множественное наследование используется при наследовании от интерфейсов. Интерфейс в C++ это класс, у которого все функции виртуальные. Наследование реализации применяется очень редко.&lt;br /&gt;
&lt;br /&gt;
Пример наследования реализации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:img2.png]]&lt;br /&gt;
&lt;br /&gt;
Мы видим что второй вариант с одиночным наследованием проще и логичнее.&lt;br /&gt;
&lt;br /&gt;
Пример злоупотребления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Circle&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
Point center_;&lt;br /&gt;
&lt;br /&gt;
double radius_;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но некоторые делают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Circle: Point&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
double radius_;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как мы видим, множественное наследование порой логичнее и проще заменить на включение объекта внутрь нашего класса.&lt;br /&gt;
Одним из аргументов против множественного наследования является то, что в большинстве промышленных языков его нет, и&lt;br /&gt;
там без него обходятся без особых сложностей.&lt;br /&gt;
&lt;br /&gt;
== Пример наследования от интерфейсов == &lt;br /&gt;
Наследование от нескольких интерфейсов является одним из самых оправданных случаев применения множественного наследования.&lt;br /&gt;
&lt;br /&gt;
[[Файл:img3.png]]&lt;br /&gt;
&lt;br /&gt;
== Другие особенности множественного наследования ==&lt;br /&gt;
Если в базовых классах есть метод с одинаковым именем, и мы его переопределили в наследнике, то он переопределятся сразу для всех родителей.&lt;br /&gt;
&lt;br /&gt;
Способ обойти это ограничение:&lt;br /&gt;
&lt;br /&gt;
[[Файл:img4.png]]&lt;br /&gt;
&lt;br /&gt;
Можно явно вызвать виртуальный метод базового класса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
        struct A&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            virtual void foo()=0;&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        struct B&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            virtual void foo()&lt;br /&gt;
&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
               std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;B::foo()&amp;quot; &amp;amp;lt;&amp;amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        struct C:A,B&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            virtual void foo()&lt;br /&gt;
&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
               std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;C::foo()&amp;quot; &amp;amp;lt;&amp;amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        int main()&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            C c;&lt;br /&gt;
&lt;br /&gt;
            c.B::foo();&lt;br /&gt;
&lt;br /&gt;
            system(&amp;quot;PAUSE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            return 0;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     Результат: B::foo();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица виртуальных функций и конструкторы&lt;br /&gt;
&lt;br /&gt;
Во время последовательного вызова конструкторов при создании объекта класса, внутри тела каждого конструктора указатель на таблицу виртуальных функций будет установлен на тот класс, для которого вызван конструтор. Так как контекст будет изменяться при вызове конструторов, вызывать в них виртуальные&lt;br /&gt;
функции является плохим тоном.&lt;br /&gt;
&lt;br /&gt;
== Виртуальное наследование ==&lt;br /&gt;
Рассмотрим следующую иерархию&lt;br /&gt;
&lt;br /&gt;
[[Файл:img5.png]]&lt;br /&gt;
&lt;br /&gt;
При обычно наследовании мы бы получили в классе C две копии класса A. Но если семантика нашего наследования предполагает что C является A, &lt;br /&gt;
также как B1 и B2, то мы получаем логическое противоречие такой конструкции. Также такая конструкция будет не верна, если нам нужно иметь одну копию класса A в C. Для преодоления этой ситуации в C++ было введено виртуальное наследование. Ключевое слово virtual при наследовании показывает компилятору, что класс наследник может учавствовать в ромбовидных иерархиях. &lt;br /&gt;
&lt;br /&gt;
Вот как будет выглядеть код этого примера с виртуальным наследованием:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
        struct A&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            void foo()&lt;br /&gt;
&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;A&amp;quot; &amp;amp;lt;&amp;amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        struct B1: virtual A&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        struct B2: virtual A&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        struct C:B1,B2&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        int main()&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            C c;&lt;br /&gt;
&lt;br /&gt;
            c.foo();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            system(&amp;quot;PAUSE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            return 0;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как это работает&lt;br /&gt;
&lt;br /&gt;
Компилятор добавляет в таблицу виртуальных функций класса наследника функцию, которая возвращает указатель на объект базового класса. Таким образом эти функции у B1 и B2 будут возвращать один и тот же указатель на объект A, сожержащийся в C. Реализация виртуального наследования не регламентируется, &lt;br /&gt;
этому есть и другие подходы, например, основанный на отдельной таблице виртуальных классов. &lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Дружба&amp;quot; ==&lt;br /&gt;
В С++ существует ключевое слово friend, означающее что класс или функция будут видеть все данные и методы класса, с которым они дружат. Если A друг B, то это не значит что B друг A. &lt;br /&gt;
&lt;br /&gt;
Пример (Функция foo Дружит с классом Bar): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
        struct Bar&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
        friend void foo(Bar&amp;amp;amp; bar);&lt;br /&gt;
&lt;br /&gt;
        private:&lt;br /&gt;
&lt;br /&gt;
            static int data_;&lt;br /&gt;
&lt;br /&gt;
            void MakeCoffee()&lt;br /&gt;
&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        void foo(Bar&amp;amp;amp; bar)&lt;br /&gt;
&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            bar.MakeCoffee();&lt;br /&gt;
&lt;br /&gt;
            std::cout &amp;amp;lt;&amp;amp;lt; Bar::data_ &amp;amp;lt;&amp;amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        int Bar::data_;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img5.png&amp;diff=245</id>
		<title>Файл:Img5.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img5.png&amp;diff=245"/>
				<updated>2011-05-19T00:06:44Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img4.png&amp;diff=244</id>
		<title>Файл:Img4.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img4.png&amp;diff=244"/>
				<updated>2011-05-19T00:06:36Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img3.png&amp;diff=243</id>
		<title>Файл:Img3.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img3.png&amp;diff=243"/>
				<updated>2011-05-19T00:06:27Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img2.png&amp;diff=242</id>
		<title>Файл:Img2.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img2.png&amp;diff=242"/>
				<updated>2011-05-19T00:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img1.png&amp;diff=241</id>
		<title>Файл:Img1.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Img1.png&amp;diff=241"/>
				<updated>2011-05-19T00:05:58Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D1%8B_%D0%A1%2B%2B&amp;diff=240</id>
		<title>Конспекты С++</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D1%8B_%D0%A1%2B%2B&amp;diff=240"/>
				<updated>2011-05-19T00:02:08Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: /* 1 семестр (осень-зима 2010) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1 семестр (осень-зима 2010) ==&lt;br /&gt;
&lt;br /&gt;
* [[ Как происходит компиляция|Как происходит компиляция. Алексей Давыдов. 08.09.2010]]&lt;br /&gt;
* [[ Указатели и ссылки|Указатели и ссылки. Екатерина Полищук. 10.09.2010]]&lt;br /&gt;
* [[ Динамическое распределение памяти|Динамическое распределение памяти. Алексей Гуревич. 17.09.2010]]&lt;br /&gt;
* [[ Классы|Классы. Курьян Кристина. 08.10.2010]]&lt;br /&gt;
* [[ Перегрузка операторов|Перегрузка операторов. Мария Фомкина. 12.11.2010]]&lt;br /&gt;
* [[ Множественное наследование, дружба|Множественное наследование, дружба Евгений Баталов. 02.12.2010]]&lt;br /&gt;
&lt;br /&gt;
== 2 семестр (зима-весна 2011) ==&lt;br /&gt;
&lt;br /&gt;
* [[ Напоминание про inline и static. Синглтон.|Напоминание про inline и static. Синглтон. Екатерина Полищук. 11.02.2011]]&lt;br /&gt;
* [[ STL. Последовательные контейнеры|STL. Последовательные контейнеры. Мария Фомкина. 18.02.2011]]&lt;br /&gt;
* [[ Ассоциативные контейнеры |STL. Ассоциативные контейнеры. Светлана Марченко. 25.02.2011]]&lt;br /&gt;
* [[ Указатели на функции|Указатели на функции. Курьян Кристина. 18.03.2011]]&lt;br /&gt;
* [[ Исключения | Методы обработки ошибок. Исключения. Гарантии исключений. Евгений Баталов. 01.04.2011 ]]&lt;br /&gt;
* [[ Метапрограммирование на C++ | Метапрограммирование на C++. Александр Карташов. 06.05.2011 ]]&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=239</id>
		<title>Исключения</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=239"/>
				<updated>2011-05-18T23:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: /* Assert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обработка ошибок ==&lt;br /&gt;
В программах всегда возникают ошибки. Их надо уметь обрабатывать, иначе часто мы будем беспокоить пользователя по пустяку. Рассмотрим основные способы обработки ошибок.&lt;br /&gt;
&lt;br /&gt;
== Обработка кода возврата ==&lt;br /&gt;
Из каждой функции возвращаем код, в котором содержится дополнительная информация о результате работы функции. &lt;br /&gt;
Программист функции задает семантику этого кода. Одним из его значений должен быть &amp;quot;успех&amp;quot;. Результат функции возвращается через параметр, передаваемый по ссылке. &lt;br /&gt;
Такой подход увеличивает колличество кода. Нужно проверять код возврата. В зависимости от проекта, этот код может понадобиться проверять каждый раз после вызова функции.&lt;br /&gt;
Также пользователь функции должен знать семантику кода возврата. Для кода возврата можно не создавать отдельную переменную в сигнатуре функции.&lt;br /&gt;
Можно возвращать значение, которое не входит в множество допустимых значений. Например, результат функции всегда положительный, но мы возвратим отрицательное число, если что-то пошло не так.&lt;br /&gt;
Тогда вызов будет короче, но мы совместим ответственности - результат будет отвечает и за ошибки. Если множество значений функции в перспективе может расшириться, то этот способ не подходит.&lt;br /&gt;
&lt;br /&gt;
== Глобальная переменная errno ==&lt;br /&gt;
Все функции в случае возникновения ошибки записывают ее код в глобальную переменную errno. Проверять errno может понадобиться после каждого вызова.&lt;br /&gt;
При таком подходе мы можем строить выражения из вызовов функций. Использование глобальной переменной требует синхронизации в многопоточных приложениях.&lt;br /&gt;
&lt;br /&gt;
== SEH, Signals ==&lt;br /&gt;
Платформенно зависимые исключения и сигналы от ОС. Например деление на 0, извлечение квадратного корня из отрицательного числа, разъименование нулевого указателя, порча стека и т.п.&lt;br /&gt;
Обычно говорят о том, что дальнейшее выполнение программы не имеет смысла, потому часто явно не обрабатываются в программах. 24/7/365 сервисы обычно требуют обработки таких исключений.&lt;br /&gt;
Это отдельная большая тема.&lt;br /&gt;
&lt;br /&gt;
== Assert ==&lt;br /&gt;
Это утверждения, логические условия, истинность которых проверяется либо во время выполнения, либо во время компиляции (static assert). &lt;br /&gt;
Если статическое утверждение во время компиляции ложно, то возникает ошибка компиляции. Если во время вполнения утверждение ложно, то&lt;br /&gt;
в стандартный поток ошибок выводится текст этого утверждения и программа завершается. &lt;br /&gt;
Assert'ы отключаются, если при компиляции определен символ NDEBUG.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
assert(1 + 1 == 2 &amp;amp;&amp;amp; &amp;quot;working with field which charcteristic &amp;gt; 2&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Строка с комментарием к assert'у &amp;quot;working with ...&amp;quot; - это ненулевой char const *, потому он всегда True и не влияет на результат логического И.&lt;br /&gt;
&lt;br /&gt;
== Исключения ==&lt;br /&gt;
Исключение - событие, возникающее во время выполнения программы. Обычно обозначает что-то негативное. Существуют различные точки зрения на то, когда нужно использовать исключения.&lt;br /&gt;
Некоторые используют их, когда произошло малейшее нарушение работы программы (например ошибка конвертации строки в число), а другие только в случае если дальнейшее выполнение программы не имеет смысла.&lt;br /&gt;
&lt;br /&gt;
Работа с исключениями состоит из следующих этапов:&lt;br /&gt;
* Выполнено условие, при котором стоит сообщить внешнему коду о произошедшей ошибке.&lt;br /&gt;
* Бросается исключение.&lt;br /&gt;
* Исключение всплывает по стеку вызовов программы до первой точки, в которой это исключение может быть обработано.&lt;br /&gt;
* В обработчике исключения можно выполнить все действия для восстановления программы и продолжить ее выполнение или если это не возможно в данном месте кода, бросить новое исключение дальше по стеку. &lt;br /&gt;
* Если исключение не было обработано и всплыло выше функции main, то вызывается обработчик unexpected, который по умолчанию завершает выполнение программы.&lt;br /&gt;
&lt;br /&gt;
Некоторые моменты: &lt;br /&gt;
* Если исключение поймано (обработано), то вызовутся деструкторы всех объектов, которые лежали на стеке от места бросания до места обработки.&lt;br /&gt;
* Если мы выделим память в куче, а затем кинем исключение, то выделенная память не будет освобождена (деструктор указателя ничего не делает).&lt;br /&gt;
* Реальный механизм работы исключений и его накладные расходы зависит от разрядности процессора и ОС.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим базовый синтаксис работы с исключениям ив C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		if (a == 0)&lt;br /&gt;
			throw 0;&lt;br /&gt;
		int res = 10/a;&lt;br /&gt;
	}&lt;br /&gt;
	catch(int ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex == 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;division by zero&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	catch(float ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex &amp;gt;= 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;float&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;try {}&amp;lt;/code&amp;gt; показывает границы блока кода, в котором мы хотим ловить исключения. Исключения будут ловиться не только в самом блоке, &lt;br /&gt;
но и ниже по стеку вызовов - во всех функциях, вызванных из блока &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;catch(...){}&amp;lt;/code&amp;gt; определяет код-обработчик исключения, который выполняется в случае если оно было кинуто в &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;. Аргумент &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; означает что будут ловиться все исключения.&lt;br /&gt;
Если мы хотим перехватить исключение какого-то конкретного типа, то в аргументе &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; объявляют переменную этого типа. Для классов и структур используется константная ссылка.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; принимает экземпляр типа, который мы хотим кинуть.&lt;br /&gt;
&lt;br /&gt;
Давайте поймем почему код, который бросает примитивные типы плох?&lt;br /&gt;
В обработчике &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; нам приходится проверять какое целое значение было кинуто, чтобы понять что с ним делать.&lt;br /&gt;
Мы можем определить отдельный класс для каждого исключения и бросать уже объекты этих классов. &lt;br /&gt;
Это избавит нас от необходимости проверять еще какую-то информацию, неявно передаваемую в кидаемом экземпляре примитивного типа.&lt;br /&gt;
Для удобства в стандартной библиотеки &amp;lt;code&amp;gt;stl&amp;lt;/code&amp;gt; уже есть класс исключений &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt;, объявленный в файле &amp;lt;code&amp;gt;&amp;lt;exception&amp;gt;&amp;lt;/code&amp;gt;. Для поддержания единообразности кода на C++, следует наследовать свои классы исключений от него. Также у &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt; есть виртуальный метод &amp;lt;code&amp;gt;what()&amp;lt;/code&amp;gt;, который удобно использовать для возвращения информации об исключении&lt;br /&gt;
в удобном для прочитывания человеком формате. Также стандартная библиотека поределяет накоторые другие классы, например &amp;lt;code&amp;gt;std::logic_error, std::runtime_error, std::bad_alloc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нужно помнить, что при выборе блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;, который соответствует кинутому исключению, приведение типов не происходит. Одновременно может быть активно только одно исключение, поэтому если во время всплытия исключения по стеку&lt;br /&gt;
до того как исключение найдет свой обработчик, кинется еще одно исключение, программа полностью закончит свое выполнение. Теперь давайте вспомним какой код выподняется &lt;br /&gt;
во время всплытия исключения - происходят вызовы всех деструкторов. Если хотябы один деструктор кинет исключение, то программа полностью завершится. Поэтому деструкторы не должны кидать исключений. &lt;br /&gt;
Теперь представим себе что будет, если кинуть исключение в конструкторе - до завершения конструктора объект не считается созданным, потому в случае падения исключения в конструкторе, деструктор создаваемого объекта &lt;br /&gt;
не будет вызван. То есть если мы уже выделили какой-то ресурс в конструкторе, а потом в нем возникло исключение, то ресурс не будут освобожден.&lt;br /&gt;
Поэтому надо писать конструкторы так, чтобы при возникновении в нем исключения, можно было освободить занятые ресурсы и сообщить об исключении дальше.&lt;br /&gt;
Напомним также, что при нормальной работе программы оператор &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; не кидает исключений, а оператор &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; может.&lt;br /&gt;
Напишем класс, который освободит выделенную память если произошло исключение в конструкторе. &lt;br /&gt;
Здесь же используется специальный синтаксис для перехвата исключений в списке инициализации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A&lt;br /&gt;
{&lt;br /&gt;
	int* p1;&lt;br /&gt;
	int* p2;&lt;br /&gt;
&lt;br /&gt;
	A(size_t p1_sz, size_t p2_sz) &lt;br /&gt;
		try&lt;br /&gt;
		:	p1(new int[p1_sz])&lt;br /&gt;
		,	p2(0)&lt;br /&gt;
	{&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			p2 = new int[p2_sz];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete[] p1; //only p1 allocated&lt;br /&gt;
			throw;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		//no memory allocated&lt;br /&gt;
		throw;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	~A()&lt;br /&gt;
	{&lt;br /&gt;
		delete[] p1;&lt;br /&gt;
		delete[] p2;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Упражнение:&lt;br /&gt;
Опеределить сколько исключений может быть брошено в следующем участке кода, если a и b - экземпляры произвольных типов данных.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	if (a + b == c + d)&lt;br /&gt;
	{&lt;br /&gt;
		return a * b;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подсказка: учтите что вызываются операторы приведения типов, +, *, ==.&lt;br /&gt;
&lt;br /&gt;
== Гарантии, которые может предоставлять код по отношению к исключениям ==&lt;br /&gt;
Далее будет удобно оперировать понятием объекта, но все сказанное также относится и к обычным функциям.&lt;br /&gt;
Код, который мы пишем и используем, при возникновении внутри себя исключений может вести себя по разному. Это поведение и определяют уровни гарантий исключений.&lt;br /&gt;
Они специфицируют каким будет поведение кода и каково будет состояние объекта по отношению к внешнему миру, после возникновения в нем исключения. Рассмотрим их.&lt;br /&gt;
&lt;br /&gt;
* Гарантия отсутствия исключений. Такая гарантия специфицирует, что либо ошибок нет, либо все ошибки обрабатываются и объект выполняет все требуемые функции.&lt;br /&gt;
* Строгая гарантия исключений (транзакционность). Объект после обработки ошибки возвращается в состояние перед вызовом метода, в котором она возникла. Если мы выполняем ввод\вывод, то гарантировать строгую гарантию невозможно без очень сложных мероприятий.&lt;br /&gt;
* Базовая гарантия. После обработки исключения оказываемся в любом другом согласованном состоянии.&lt;br /&gt;
&lt;br /&gt;
Напишем неполный класс массива, который реализует строгую гарантию исключений при копировании через конструктор.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
struct Array&lt;br /&gt;
{&lt;br /&gt;
	Array(size_t size)&lt;br /&gt;
		:	size_(size)&lt;br /&gt;
		,	data_(new T[size])&lt;br /&gt;
	{}&lt;br /&gt;
&lt;br /&gt;
	Array(Array const &amp;amp; src)&lt;br /&gt;
	{&lt;br /&gt;
		T* old_data = data_;&lt;br /&gt;
		size_t old_size = size_;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			data_ = new T[src.size_];&lt;br /&gt;
			size_ = src.size_;&lt;br /&gt;
			for(size_t i = 0; i &amp;lt; size_; ++i)&lt;br /&gt;
				data_[i] = src.data_[i];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete data_;&lt;br /&gt;
			data_ = old_data;&lt;br /&gt;
			size_ = old_size;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	T* data_;&lt;br /&gt;
	size_t size_;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=238</id>
		<title>Исключения</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=238"/>
				<updated>2011-05-18T23:40:28Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: Новая страница: «== Обработка ошибок == В программах всегда возникают ошибки. Их надо уметь обрабатывать, ина…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обработка ошибок ==&lt;br /&gt;
В программах всегда возникают ошибки. Их надо уметь обрабатывать, иначе часто мы будем беспокоить пользователя по пустяку. Рассмотрим основные способы обработки ошибок.&lt;br /&gt;
&lt;br /&gt;
== Обработка кода возврата ==&lt;br /&gt;
Из каждой функции возвращаем код, в котором содержится дополнительная информация о результате работы функции. &lt;br /&gt;
Программист функции задает семантику этого кода. Одним из его значений должен быть &amp;quot;успех&amp;quot;. Результат функции возвращается через параметр, передаваемый по ссылке. &lt;br /&gt;
Такой подход увеличивает колличество кода. Нужно проверять код возврата. В зависимости от проекта, этот код может понадобиться проверять каждый раз после вызова функции.&lt;br /&gt;
Также пользователь функции должен знать семантику кода возврата. Для кода возврата можно не создавать отдельную переменную в сигнатуре функции.&lt;br /&gt;
Можно возвращать значение, которое не входит в множество допустимых значений. Например, результат функции всегда положительный, но мы возвратим отрицательное число, если что-то пошло не так.&lt;br /&gt;
Тогда вызов будет короче, но мы совместим ответственности - результат будет отвечает и за ошибки. Если множество значений функции в перспективе может расшириться, то этот способ не подходит.&lt;br /&gt;
&lt;br /&gt;
== Глобальная переменная errno ==&lt;br /&gt;
Все функции в случае возникновения ошибки записывают ее код в глобальную переменную errno. Проверять errno может понадобиться после каждого вызова.&lt;br /&gt;
При таком подходе мы можем строить выражения из вызовов функций. Использование глобальной переменной требует синхронизации в многопоточных приложениях.&lt;br /&gt;
&lt;br /&gt;
== SEH, Signals ==&lt;br /&gt;
Платформенно зависимые исключения и сигналы от ОС. Например деление на 0, извлечение квадратного корня из отрицательного числа, разъименование нулевого указателя, порча стека и т.п.&lt;br /&gt;
Обычно говорят о том, что дальнейшее выполнение программы не имеет смысла, потому часто явно не обрабатываются в программах. 24/7/365 сервисы обычно требуют обработки таких исключений.&lt;br /&gt;
Это отдельная большая тема.&lt;br /&gt;
&lt;br /&gt;
== Assert ==&lt;br /&gt;
Это утверждения, логические условия, истинность которых проверяется либо во время выполнения, либо во время компиляции (static assert). &lt;br /&gt;
Если статическое утверждение во время компиляции ложно, то возникает ошибка компиляции. Если во время вполнения утверждение ложно, то&lt;br /&gt;
в стандартный поток ошибок выводится текст этого утверждения и программа завершается. &lt;br /&gt;
Assert'ы отключаются, если при компиляции определен символ NDEBUG.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
assert(1 + 1 == 2 &amp;amp;&amp;amp; &amp;quot;working with field which charcteristic &amp;gt; 2&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Строка с комментарием к assert'у &amp;quot;working with ...&amp;quot; - это ненулевой char const *, потому он всегда True и не влияет на рещультат логического И.&lt;br /&gt;
&lt;br /&gt;
== Исключения ==&lt;br /&gt;
Исключение - событие, возникающее во время выполнения программы. Обычно обозначает что-то негативное. Существуют различные точки зрения на то, когда нужно использовать исключения.&lt;br /&gt;
Некоторые используют их, когда произошло малейшее нарушение работы программы (например ошибка конвертации строки в число), а другие только в случае если дальнейшее выполнение программы не имеет смысла.&lt;br /&gt;
&lt;br /&gt;
Работа с исключениями состоит из следующих этапов:&lt;br /&gt;
* Выполнено условие, при котором стоит сообщить внешнему коду о произошедшей ошибке.&lt;br /&gt;
* Бросается исключение.&lt;br /&gt;
* Исключение всплывает по стеку вызовов программы до первой точки, в которой это исключение может быть обработано.&lt;br /&gt;
* В обработчике исключения можно выполнить все действия для восстановления программы и продолжить ее выполнение или если это не возможно в данном месте кода, бросить новое исключение дальше по стеку. &lt;br /&gt;
* Если исключение не было обработано и всплыло выше функции main, то вызывается обработчик unexpected, который по умолчанию завершает выполнение программы.&lt;br /&gt;
&lt;br /&gt;
Некоторые моменты: &lt;br /&gt;
* Если исключение поймано (обработано), то вызовутся деструкторы всех объектов, которые лежали на стеке от места бросания до места обработки.&lt;br /&gt;
* Если мы выделим память в куче, а затем кинем исключение, то выделенная память не будет освобождена (деструктор указателя ничего не делает).&lt;br /&gt;
* Реальный механизм работы исключений и его накладные расходы зависит от разрядности процессора и ОС.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим базовый синтаксис работы с исключениям ив C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		if (a == 0)&lt;br /&gt;
			throw 0;&lt;br /&gt;
		int res = 10/a;&lt;br /&gt;
	}&lt;br /&gt;
	catch(int ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex == 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;division by zero&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	catch(float ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex &amp;gt;= 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;float&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;try {}&amp;lt;/code&amp;gt; показывает границы блока кода, в котором мы хотим ловить исключения. Исключения будут ловиться не только в самом блоке, &lt;br /&gt;
но и ниже по стеку вызовов - во всех функциях, вызванных из блока &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;catch(...){}&amp;lt;/code&amp;gt; определяет код-обработчик исключения, который выполняется в случае если оно было кинуто в &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;. Аргумент &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; означает что будут ловиться все исключения.&lt;br /&gt;
Если мы хотим перехватить исключение какого-то конкретного типа, то в аргументе &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; объявляют переменную этого типа. Для классов и структур используется константная ссылка.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; принимает экземпляр типа, который мы хотим кинуть.&lt;br /&gt;
&lt;br /&gt;
Давайте поймем почему код, который бросает примитивные типы плох?&lt;br /&gt;
В обработчике &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; нам приходится проверять какое целое значение было кинуто, чтобы понять что с ним делать.&lt;br /&gt;
Мы можем определить отдельный класс для каждого исключения и бросать уже объекты этих классов. &lt;br /&gt;
Это избавит нас от необходимости проверять еще какую-то информацию, неявно передаваемую в кидаемом экземпляре примитивного типа.&lt;br /&gt;
Для удобства в стандартной библиотеки &amp;lt;code&amp;gt;stl&amp;lt;/code&amp;gt; уже есть класс исключений &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt;, объявленный в файле &amp;lt;code&amp;gt;&amp;lt;exception&amp;gt;&amp;lt;/code&amp;gt;. Для поддержания единообразности кода на C++, следует наследовать свои классы исключений от него. Также у &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt; есть виртуальный метод &amp;lt;code&amp;gt;what()&amp;lt;/code&amp;gt;, который удобно использовать для возвращения информации об исключении&lt;br /&gt;
в удобном для прочитывания человеком формате. Также стандартная библиотека поределяет накоторые другие классы, например &amp;lt;code&amp;gt;std::logic_error, std::runtime_error, std::bad_alloc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нужно помнить, что при выборе блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;, который соответствует кинутому исключению, приведение типов не происходит. Одновременно может быть активно только одно исключение, поэтому если во время всплытия исключения по стеку&lt;br /&gt;
до того как исключение найдет свой обработчик, кинется еще одно исключение, программа полностью закончит свое выполнение. Теперь давайте вспомним какой код выподняется &lt;br /&gt;
во время всплытия исключения - происходят вызовы всех деструкторов. Если хотябы один деструктор кинет исключение, то программа полностью завершится. Поэтому деструкторы не должны кидать исключений. &lt;br /&gt;
Теперь представим себе что будет, если кинуть исключение в конструкторе - до завершения конструктора объект не считается созданным, потому в случае падения исключения в конструкторе, деструктор создаваемого объекта &lt;br /&gt;
не будет вызван. То есть если мы уже выделили какой-то ресурс в конструкторе, а потом в нем возникло исключение, то ресурс не будут освобожден.&lt;br /&gt;
Поэтому надо писать конструкторы так, чтобы при возникновении в нем исключения, можно было освободить занятые ресурсы и сообщить об исключении дальше.&lt;br /&gt;
Напомним также, что при нормальной работе программы оператор &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; не кидает исключений, а оператор &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; может.&lt;br /&gt;
Напишем класс, который освободит выделенную память если произошло исключение в конструкторе. &lt;br /&gt;
Здесь же используется специальный синтаксис для перехвата исключений в списке инициализации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A&lt;br /&gt;
{&lt;br /&gt;
	int* p1;&lt;br /&gt;
	int* p2;&lt;br /&gt;
&lt;br /&gt;
	A(size_t p1_sz, size_t p2_sz) &lt;br /&gt;
		try&lt;br /&gt;
		:	p1(new int[p1_sz])&lt;br /&gt;
		,	p2(0)&lt;br /&gt;
	{&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			p2 = new int[p2_sz];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete[] p1; //only p1 allocated&lt;br /&gt;
			throw;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		//no memory allocated&lt;br /&gt;
		throw;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	~A()&lt;br /&gt;
	{&lt;br /&gt;
		delete[] p1;&lt;br /&gt;
		delete[] p2;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Упражнение:&lt;br /&gt;
Опеределить сколько исключений может быть брошено в следующем участке кода, если a и b - экземпляры произвольных типов данных.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	if (a + b == c + d)&lt;br /&gt;
	{&lt;br /&gt;
		return a * b;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подсказка: учтите что вызываются операторы приведения типов, +, *, ==.&lt;br /&gt;
&lt;br /&gt;
== Гарантии, которые может предоставлять код по отношению к исключениям ==&lt;br /&gt;
Далее будет удобно оперировать понятием объекта, но все сказанное также относится и к обычным функциям.&lt;br /&gt;
Код, который мы пишем и используем, при возникновении внутри себя исключений может вести себя по разному. Это поведение и определяют уровни гарантий исключений.&lt;br /&gt;
Они специфицируют каким будет поведение кода и каково будет состояние объекта по отношению к внешнему миру, после возникновения в нем исключения. Рассмотрим их.&lt;br /&gt;
&lt;br /&gt;
* Гарантия отсутствия исключений. Такая гарантия специфицирует, что либо ошибок нет, либо все ошибки обрабатываются и объект выполняет все требуемые функции.&lt;br /&gt;
* Строгая гарантия исключений (транзакционность). Объект после обработки ошибки возвращается в состояние перед вызовом метода, в котором она возникла. Если мы выполняем ввод\вывод, то гарантировать строгую гарантию невозможно без очень сложных мероприятий.&lt;br /&gt;
* Базовая гарантия. После обработки исключения оказываемся в любом другом согласованном состоянии.&lt;br /&gt;
&lt;br /&gt;
Напишем неполный класс массива, который реализует строгую гарантию исключений при копировании через конструктор.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
struct Array&lt;br /&gt;
{&lt;br /&gt;
	Array(size_t size)&lt;br /&gt;
		:	size_(size)&lt;br /&gt;
		,	data_(new T[size])&lt;br /&gt;
	{}&lt;br /&gt;
&lt;br /&gt;
	Array(Array const &amp;amp; src)&lt;br /&gt;
	{&lt;br /&gt;
		T* old_data = data_;&lt;br /&gt;
		size_t old_size = size_;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			data_ = new T[src.size_];&lt;br /&gt;
			size_ = src.size_;&lt;br /&gt;
			for(size_t i = 0; i &amp;lt; size_; ++i)&lt;br /&gt;
				data_[i] = src.data_[i];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete data_;&lt;br /&gt;
			data_ = old_data;&lt;br /&gt;
			size_ = old_size;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	T* data_;&lt;br /&gt;
	size_t size_;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D1%8B_%D0%A1%2B%2B&amp;diff=237</id>
		<title>Конспекты С++</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D1%8B_%D0%A1%2B%2B&amp;diff=237"/>
				<updated>2011-05-18T23:12:40Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1 семестр (осень-зима 2010) ==&lt;br /&gt;
&lt;br /&gt;
* [[ Как происходит компиляция|Как происходит компиляция. Алексей Давыдов. 08.09.2010]]&lt;br /&gt;
* [[ Указатели и ссылки|Указатели и ссылки. Екатерина Полищук. 10.09.2010]]&lt;br /&gt;
* [[ Динамическое распределение памяти|Динамическое распределение памяти. Алексей Гуревич. 17.09.2010]]&lt;br /&gt;
* [[ Классы|Классы. Курьян Кристина. 08.10.2010]]&lt;br /&gt;
* [[ Перегрузка операторов|Перегрузка операторов. Мария Фомкина. 12.11.2010]]&lt;br /&gt;
&lt;br /&gt;
== 2 семестр (зима-весна 2011) ==&lt;br /&gt;
&lt;br /&gt;
* [[ Напоминание про inline и static. Синглтон.|Напоминание про inline и static. Синглтон. Екатерина Полищук. 11.02.2011]]&lt;br /&gt;
* [[ STL. Последовательные контейнеры|STL. Последовательные контейнеры. Мария Фомкина. 18.02.2011]]&lt;br /&gt;
* [[ Ассоциативные контейнеры |STL. Ассоциативные контейнеры. Светлана Марченко. 25.02.2011]]&lt;br /&gt;
* [[ Указатели на функции|Указатели на функции. Курьян Кристина. 18.03.2011]]&lt;br /&gt;
* [[ Исключения | Методы обработки ошибок. Исключения. Гарантии исключений. Евгений Баталов. 01.04.2011 ]]&lt;br /&gt;
* [[ Метапрограммирование на C++ | Метапрограммирование на C++. Александр Карташов. 06.05.2011 ]]&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=87</id>
		<title>Поисковые системы</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=87"/>
				<updated>2011-03-14T17:46:44Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагается провести семинар по поисковым системам по базам данных (не про веб-поиск). Формат: много мини-докладов в один день и создание соответствующих страниц в wiki.&lt;br /&gt;
В качестве первого этапа предлагается составить список тем, которые можно было бы обсудить. Сейчас можно только предлагать темы, распределять их будем наследующем этапе.&lt;br /&gt;
&lt;br /&gt;
* Механизм, архитектура поисковой системы с 3 потоками управления: обработка пользовательских запросов, исполнение запросов, индексирование новых данных.&lt;br /&gt;
* Алгоритм обратных индексов.&lt;br /&gt;
* Кластеризация в Data Mining.&lt;br /&gt;
* Использование префиксного дерева для хранения и поиска строк во внешней памяти.&lt;br /&gt;
* Распределение нагрузки между узлами поисковой системы&lt;br /&gt;
* Напиши название темы здесь.&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Shortest_Path_Service&amp;diff=86</id>
		<title>Shortest Path Service</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Shortest_Path_Service&amp;diff=86"/>
				<updated>2011-03-14T11:49:19Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студент: Евгений Баталов&lt;br /&gt;
* Руководитель: Антон Ковалев&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Описание: продолжение разработки сервиса для поиска кратчайшего пути на дорожной карте, &lt;br /&gt;
	  использующего картографические данные проекта OpenStreetMap.&lt;br /&gt;
	  У OpenStreetMap такого сервиса нет.&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Реализовано на начало весеннего семестра:&lt;br /&gt;
* Парсер xml файлов OpenStreetMap&lt;br /&gt;
* Граф с ленивой подкачкой вершин из БД Sqlite&lt;br /&gt;
* Графическая оболочка под Windows для тестирования алгоритмов на графе&lt;br /&gt;
* Алгоритмы A* и двунаправленный A*&lt;br /&gt;
* Пользовательский web интерфейс на основе Google maps и JQuery&lt;br /&gt;
* Http сервер на Python и работающий с ним сервис поиска кратчайшего пути&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предполагаемые этапы:&lt;br /&gt;
* Сборка проекта под Linux и сохранение кросплатформенности (Linux &amp;amp; Windows)&lt;br /&gt;
* Использовать FastCGI для взаимодействия с http сервером&lt;br /&gt;
* Реализация сервиса для поиска кратчайшего пути на дорожной карте&lt;br /&gt;
* Профилирование, unit, stress тестирование проекта&lt;br /&gt;
* Реализация обновления картографических данных в графе&lt;br /&gt;
* (возможный этап) слияние с проектом Алексей Гуревича (АУ, кафедра SE, 5 курс) с целью создание многопользовательского приложения с web-интерфейсом для поиска кратчайших путей на графе дорог на основе разработанных алгоритмов и инструментов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ожидаемый результат:&lt;br /&gt;
* Сервис&lt;br /&gt;
* Результаты стресс тестирования и профилирования&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Shortest_Path_Service&amp;diff=85</id>
		<title>Shortest Path Service</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Shortest_Path_Service&amp;diff=85"/>
				<updated>2011-03-14T11:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: Новая страница: «* Студент: Евгений Баталов * Руководитель: Антон Ковалев  Описание: продолжение разработки …»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студент: Евгений Баталов&lt;br /&gt;
* Руководитель: Антон Ковалев&lt;br /&gt;
&lt;br /&gt;
Описание: продолжение разработки сервиса для поиска кратчайшего пути на дорожной карте, &lt;br /&gt;
	  использующего картографические данные проекта OpenStreetMap.&lt;br /&gt;
	  У OpenStreetMap такого сервиса нет.&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Предполагаемые этапы:&lt;br /&gt;
* Сборка проекта под Linux и сохранение кросплатформенности (Linux &amp;amp; Windows)&lt;br /&gt;
* Использовать FastCGI для взаимодействия с http сервером&lt;br /&gt;
* Реализация сервиса для поиска кратчайшего пути на дорожной карте&lt;br /&gt;
* Профилирование, unit, stress тестирование проекта&lt;br /&gt;
* Реализация обновления картографических данных в графе&lt;br /&gt;
* (возможный этап) слияние с проектом Алексей Гуревича (АУ, кафедра SE, 5 курс) с целью создание многопользовательского приложения с web-интерфейсом для поиска кратчайших путей на графе дорог на основе разработанных алгоритмов и инструментов.&lt;br /&gt;
&lt;br /&gt;
Ожидаемый результат:&lt;br /&gt;
* Сервис&lt;br /&gt;
* Результаты стресс тестирования и профилирования&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=84</id>
		<title>Темы практик</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=84"/>
				<updated>2011-03-14T11:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: /* Весна 2011 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На этой странице собраны темы индивидуальных и командных проектов. &lt;br /&gt;
&lt;br /&gt;
== Весна 2011 ==&lt;br /&gt;
&lt;br /&gt;
* [[Genome assembler]] (Mariya Fomkina)&lt;br /&gt;
&lt;br /&gt;
* [[Анализ изображений с целью поиска похожих лиц]] (Екатерина Полищук)&lt;br /&gt;
&lt;br /&gt;
* [[The Shortest Path Problem]] (Алексей Гуревич)&lt;br /&gt;
&lt;br /&gt;
* [[Shortest Path Service]] (Евгений Баталов)&lt;br /&gt;
&lt;br /&gt;
== Пул свободных тем ==&lt;br /&gt;
&lt;br /&gt;
* [[GeoToDo list]]&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=46</id>
		<title>Участник:Eabatalov89</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=46"/>
				<updated>2011-03-09T21:40:50Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;e-mail: [mailto:eabatalov89@gmail.com eabatalov89@gmail.com]&lt;br /&gt;
&lt;br /&gt;
[[Файл:eabatalov_ava1.jpg]]&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=44</id>
		<title>Участник:Eabatalov89</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eabatalov89&amp;diff=44"/>
				<updated>2011-03-09T18:22:12Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: Новая страница: «e-mail: [mailto:eabatalov89@gmail.com, eabatalov89@gmail.com]  Файл:eabatalov_ava1.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;e-mail: [mailto:eabatalov89@gmail.com, eabatalov89@gmail.com]&lt;br /&gt;
&lt;br /&gt;
[[Файл:eabatalov_ava1.jpg]]&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Eabatalov_ava1.jpg&amp;diff=43</id>
		<title>Файл:Eabatalov ava1.jpg</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Eabatalov_ava1.jpg&amp;diff=43"/>
				<updated>2011-03-09T18:21:53Z</updated>
		
		<summary type="html">&lt;p&gt;Eabatalov89: My photo small&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My photo small&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	</feed>