tag:blogger.com,1999:blog-36693002376263444572024-01-15T19:01:15.442-08:00Кладовая программиста C++Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-3669300237626344457.post-39209394010315229052014-10-20T10:19:00.000-07:002014-10-20T10:19:09.623-07:00Как в Windows открыть файл в ассоциированной с ним программе средствами C++?<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Для программистов со "стажем" - это, конечно, не проблема. Но вот для новичков составляет определенную сложность, т.к. это напрямую не связано с языком программирования C++, а является функциональностью операционной системы. </div>
<div style="text-align: justify;">
Как вы уже могли догадаться, речь пойдет о применении соответствующей функции <a href="https://ru.wikipedia.org/wiki/Windows_API" target="_blank">WinAPI</a>. Представляю сегодняшнего героя - <b>ShellExecute</b>!</div>
<div>
<a name='more'></a><div style="text-align: justify;">
<br />
Как благосклонно с нами делится портал <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx" target="_blank">MSDN</a>, <b>Shell<span style="font-family: Times, Times New Roman, serif;">Execu</span>te</b> "<i>Performs an operation on a specified file</i>", что на "великом и могучем" можно расценить как "выполнение операции над определенным файлом". Что же в принципе можно сделать с помощью данной функции? Это открыть файл (отдельно для редактирования) или директорию, напечатать файл, инициировать поиск. Можно так же открыть интернет-адрес в браузере по-умолчанию. Вообщем все то, что так нам не хватает "чистом C++" на Windows :-)))). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Немного теории.<br />
Определение функции незатейливо и имеет следующий вид:</div>
<pre><code class="cpp" data-result="[object Object]">HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
);
</code></pre>
<div style="text-align: justify;">
<br />
где:<br />
<b>hwnd</b> - Дескриптор родительского окна используемый для отображения пользовательского интерфейса или сообщения об ошибках. Это значение может быть равно NULL, если операция не связана с окном (удобно, если приложение консольное). <br />
<br />
<b>lpOperation</b> - Указатель на строку с нулевым символом, упоминаемой в данном случае в качестве "глагола", который определяет выполняемое действие. Набор доступных "глаголов" зависит от конкретного файла или папки. Как правило такими "глаголами" являются действия, доступные из контекстного меню объекта. Обычно используются следующие "глаголы":<br />
<br />
<ul>
<li><i>edit</i> - запускает редактор и открывает документ для редактирования. Если <b>lpFile</b> не файл, функция не выполняется.</li>
<li><i>explore</i> - открывает в "Проводнике" папку, которая указана в <b>lpFile</b>.</li>
<li><i>find</i> - инициирует поиск, начиная с каталога, заданного <b>lpDirectory</b>.</li>
<li><i>open</i> - открывает объект, указанный в параметре <b>lpFile</b>. Объектом может быть файл или папка. Сегодня нас будет интересовать именно эта команда - "глагол". </li>
<li><i>print</i> - печатает файл, указанный в <b>lpFile</b>. Если <b>lpFile</b> не файл, функция не выполняется.</li>
<li><i>NULL</i> - используется "глагол" по умолчанию, если таковой имеется у объекта. Если нет, то используется глагол "open". Если никакой "глагол" не доступен, система использует первый "глагол", указанный в реестре.</li>
</ul>
<br />
<b>lpFile</b> - Указатель на строку с нулевым символом, который определяет файл или объект, для которого следует выполнить указанный "глагол". Для указания объекта из пространства имен <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/cc144090(v=vs.85).aspx" target="_blank">Shell</a>, необходимо указание его полного имени. Обратите внимание, что не все "глаголы" поддерживаются на всех объектах. Например, не все типы документов поддерживает "Печать". Если используется относительный путь для параметра <b>lpDirectory</b>, то не следует использовать относительный путь для <b>lpFile</b>.<br />
<br />
<b>lpParameters</b> - Если <b>lpFile</b> определяет исполняемый файл, этот параметр является указателем на строку с нулевым символом, который определяет параметры, которые передаются в приложение. Формат этой строки определяется вызываемым действием. Если <b>lpFile </b>определяет файл, <b>lpParameters</b> должно быть <b>NULL</b>.<br />
<br />
<b>lpDirectory</b> - Указатель на строку с нулевым символом, которая определяет рабочий каталог по умолчанию (в котором будут осуществляться действия с объектом). Если это значение равно <b>NULL</b>, то используется текущий рабочий каталог. Если для <b>lpFile</b> используется относительный путь, то не следует использовать относительный путь для <b>lpDirectory</b>.<br />
<br />
<b>nShowCmd</b> - Флаги, определяющие, как будет отображаться приложение при открытии. Если <b>lpFile</b> определяет файл, флаг просто передается в соответствующее приложении. Флаг передается в приложение, чтобы оно само решило как его обработать. Эти значения определены в winuser.h.<br />
Возможных значений <b>nShowCmd</b> достаточно много и они обладают "говорящими" именами, поэтому вы можете сами пройти на <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx" target="_blank">страницу</a> с описанием функции и посмотреть. В большинстве же случаев достаточным является использование SW_SHOWNORMAL (1) - активация и демонстрация окна приложения как при "первом запуске".<br />
<br />
<div style="text-align: justify;">
И прежде чем перейти к самому "сладкому", необходимо отметить один очень важный момент - это тип передаваемых символьных параметров - <span style="text-align: left;">LPCTSTR. Как говорится на сайте <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx" target="_blank">MSDN</a>: </span><i><span style="text-align: left;">LPCTSTR - это </span><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPCWSTR" target="_blank">LPCWSTR</a> если определен UNICODE, иначе <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPCSTR" target="_blank">LPCSTR</a>. Для получения дополнительной информации см <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd374131(v=vs.85).aspx" target="_blank">Типы данных Windows для Strings</a></i>. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Что реально это означает для нас? А то,что если проект настроен (что в большинстве справедливо для Visual Studio) как UNICODE, то функция <b>ShellExecute</b> будет так же ожидать переменные в UNICODE (<b>const wchar_t*</b>). В противном случае в ANSI (<b>const </b><b>char*</b>). При этом сама функция <b>ShellExecute</b> является прекомпиленной оберткой для двух других функций:</div>
<div style="text-align: justify;">
<b>ShellExecuteA - </b>для работы с параметрами в ANSI,</div>
<div style="text-align: justify;">
<b>ShellExecuteW - </b>для работы с параметрами в UNICODE.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Хотя это сложно назвать "хорошим тоном программирования", тем не менее, позволительно использовать эти функции напрямую. Для тех, кто первый раз знакомится с WinAPI, необходимо так же зафиксировать для себя, что такие "двойные" функции существуют практически для всех функций работающих с символьными параметрами.<br />
<br />
В настоящей заметке я сознательно не рассматриваю вопрос разработки ANSI|UNICODE приложения, поскольку это тема отдельного обсуждения. Но не могу не отметить один важный момент - применение макроса <b>_T</b> или <b>_TEXT</b> при передачи символьных переменных в функцию. Например:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"test.txt"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span>);</code></pre>
<br />
Для тех, кто не знает - поясню: если в проекте определен <b>_UNICODE </b>(прошу обратить внимание, что именно со знаком подчеркивания), то <b>_T</b> транслирует строковые литералы в представление с префиксом "L" (обозначая таким образом строку символов UNICODE). В противном случае <b>_T</b> транслирует строку без префикса "L" (т.е. строку символов ANSI).<br />
<br />
Т.о., если вы собираетесь разрабатывать свое приложение с поддержкой и ANSI и UNICODE, не забывайте использовать макрос <b>_T</b> или <b>_TEXT</b>. Указанные макросы определены в заголовочном файле "<b>tchar.h</b>". В противном случае вы можете столкнуться с ошибками несовпадения типов при переходе от одной кодировки к другой.<br />
<br />
Перейдем же непосредственно к теме заметки - открытию файла в ассоциированной с ним программе. В общем случае, вызов функции будет иметь следующий вид:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"test.txt"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span>);</code></pre>
Вызов функции с такими параметрами откроет файл text.txt в ассоциированном с текстовыми файлами редакторе. Поскольку при передачи файла используется относительный путь, функция будет искать файл в рабочей директории программы. Если же необходимо, чтобы программа работала с файлами в какой-то конкретной директории, то вы можете указать ее в качестве параметра <b>lpDirectory</b>:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"text.txt"</span>),<span class="keyword">NULL</span>,_TEXT(<span class="string">"C:\\temp"</span>),<span class="number">1</span> );</code></pre>
В данном примере функция будет искать файл text.txt в директории "C:\temp". Либо вы можете сделать тоже самое указав полный путь для имени файла:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"C:\\temp\\text.txt"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span> );</code></pre>
Главное помнить, что потребности определяют средства ;-). Аналогичным образом можно открыть и адрес интернет-страницы задав его в качестве имени файла (с обязательным указанием <b>www</b>):<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"www.cppstock.blogspot.com"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span> );</code></pre>
Или директорию на компьютере:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"open"</span>),_TEXT(<span class="string">"C:\\temp"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span> );</code></pre>
Или ту же директорию, но с раскрытием дерева каталогов:<br />
<pre><code class="php" data-result="[object Object]" data-second_best="[object Object]">ShellExecute(<span class="keyword">NULL</span>,_TEXT(<span class="string">"explore"</span>),_TEXT(<span class="string">"C:\\temp"</span>),<span class="keyword">NULL</span>,<span class="keyword">NULL</span>,<span class="number">1</span> );</code></pre>
Надеюсь принцип вызова функции понятен.<br />
<br />
Как и любая подобная функция, <b>ShellExecute</b> возвращает результат попытки работы с файлом - если возвращаемое число менее или равно 32, значит произошла ошибка. Перечень таких ошибок указан на <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx" target="_blank">странице</a> описания функции. Полагаю, рассмотрение вопроса обработки ошибок излишне :-).<br />
<br />
И в заключении - для использования функции <b>ShellExecute</b> необходимо подключить заголовочный файл <b>shellapi.h</b>. При использовании компиляторов отличных от Microsoft VC++, так же следует подключить и файл <b>windows.h</b>. При этом включение <b>windows.h</b> должно предшествовать <b>shellapi.h</b>:<br />
<pre><code class="xml" data-result="[object Object]" data-second_best="[object Object]">#include <span class="tag"><<span class="title">windows.h</span>></span>
#include <span class="tag"><<span class="title">shellapi.h</span>></span></code></pre>
<br />
Но для проектов на Microsoft VC++ может потребоваться подключение библиотеки <b>Shell32.lib</b> - будьте внимательны.<br />
<br />
Все! Всем кодить! :D</div>
</div>
</div>
</div>
Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-6958727586730160702014-01-06T07:06:00.000-08:002014-01-06T07:06:19.797-08:00Решения упражнений главы 4 "Типы и объявления" из книги Б.Страуструпа "Язык программирования C++"<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Рано или поздно, большинство изучающих язык программирования C++ "приходят" к книгам <a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%83%D1%81%D1%82%D1%80%D1%83%D0%BF,_%D0%91%D1%8C%D1%91%D1%80%D0%BD" target="_blank">Б.Страуструпа</a>. Кто-то посмотрит и "пойдет" дальше, а кто-то возжелает вникнуть в идеи "создателя" и попытается их осилить. По своему опыту чтения трудов мэтра, могу сказать, что процесс понимания излагаемого материала для "непосвященного" весьма затруднителен. До своего знакомства с книгами Бьерна Страуструпа, самой "сложной" в понимании считал <a href="http://www.piter.com/book.phtml?978531800001" target="_blank">опус</a> г-жи Павловской, очевидно это все результат высокого профессионализма :-).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Не малую путаницу в книги Б.Страуструпа вносят и "издержки" перевода, которые с легкостью могут поставить в тупик начинающего изучать язык C++. Отдельного упоминания заслуживают упражнения для самостоятельного выполнения, решая которые, приходится "переосмысливать" только что прочитанную главу :-).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Я не отношу себя к знатокам C++, скорее просто к "любителям", но, тем не менее, постараюсь в ряде заметок дать ответы и решения на задания одной из самых фундаментальных книг автора - "Язык программирования C++" (обращаю внимание, что для этого мною будет использоваться книга 3-го "специального" издания издательства Бином, <a href="http://binom-press.ru/catalog/Programming/programming_language_c_special_edition/" target="_blank">ISBN 978-5-7989-0425-9</a>, в версии 2011 года. Хотя в английской версии уже существует и четвертное издание, в большей степени затрагивающее "новое" в C++ привнесенное стандартом C++11. Что это за новшества, можно кратко почерпнуть из <a href="http://www.osp.ru/news/articles/2012/09/13012969/" target="_blank">этого</a> интервью).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Я категорично "ЗА" самостоятельное изучение и поиск решения на задания, поэтому воспринимаю свою затею как дополнительный стимул таки "добить" эту книгу :D, но может кому поможет лучше разобраться в изучаемом материале...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Итак, упражнения Главы 4 "Типы и объявления".</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><b><br /></b>
<b>Упражнение 1.</b><br />
<b><br /></b>
<br />
<div style="text-align: justify;">
<b>Запустить программу "Hello, world!" (§3.2). Если эта программа не компилируются, обратитесь к §B.3.1.</b></div>
<br />
<div style="text-align: justify;">
Задание не представляет собой ничего сложного - обращаемся к разделу §3.2 и просто набираем код "автора" в своей любимой IDE, а затем его компилируем.</div>
<pre><code class="cpp" data-result="[object Object]"><span class="preprocessor">#include <iostream></span>
<span class="keyword">int</span> main()
{
<span class="built_in">std</span>::<span class="built_in">cout</span> << <span class="string">"Hello, world!\n"</span>;
}</code></pre>
<div style="text-align: justify;">
У кого могут быть проблемы с компиляцией? Собственно те, у кого старые .... даже старинные компиляторы C++. С учетом того, что третья редакция книги вышла в свет в 2000 году, я, полагаю, уже не найдутся такие индивиды, кто изучает язык C++ с использованием компиляторов того времени ... Тем не менее, вопрос весьма важный и, так же как и автор книги, настоятельно рекомендую изучить материал в приложении §B.3.1.<br />
<br />
<br />
<b>Упражнение 2.</b><br />
<br />
<b>Для каждого объявления из §4.9 выполните следующее: если объявление не является определением, переделайте его в определение; если же объявление является определением, напишите для него соответствующее объявление, не являющееся одновременно и определением.</b><br />
<br />
В соответствии с заданием, имеем:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">char</span> ch;
<span class="built_in">string</span> s;
<span class="keyword">int</span> count=<span class="number">1</span>;
<span class="keyword">const</span> <span class="keyword">double</span> pi=<span class="number">3.1415926535897932385</span>;
<span class="keyword">extern</span> <span class="keyword">int</span> error_number;
<span class="keyword">const</span> <span class="keyword">char</span>* name = <span class="string">"Njal"</span>;
<span class="keyword">const</span> <span class="keyword">char</span>* season[] = {<span class="string">"spring"</span>, <span class="string">"summer"</span>, <span class="string">"fall"</span>, <span class="string">"winter"</span>};
<span class="keyword">struct</span> Date{<span class="keyword">int</span> d, m, y};
<span class="keyword">int</span> day(Date* p) {<span class="keyword">return</span> p->d;}
<span class="keyword">double</span> sqrt(<span class="keyword">double</span>);
<span class="keyword">template</span><<span class="keyword">class</span> T> T abs(T a) {<span class="keyword">return</span> a<<span class="number">0</span> ? -a : a;}
<span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point;
<span class="keyword">struct</span> User;
<span class="keyword">enum</span> Beer {Carlsberg, Tuborg, Thor};
<span class="keyword">namespace</span> NS {<span class="keyword">int</span> a};</code></pre>
Как следует из текста самого раздела 4.9, определениями не являются только:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">extern</span> <span class="keyword">int</span> error_number;
<span class="keyword">double</span> sqrt(<span class="keyword">double</span>);
<span class="keyword">struct</span> User;
<span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point; <span class="comment">//отсутствует в русской версии</span></code></pre>
И если с первыми тремя примерами тут более-менее все понятно, то вот с <b>typedef complex<short> Point</b> не все так гладко. Мало того, что в книге автор использовал двусмысленные выражения о "природе" <b>typedef</b>, так еще и переводчики упустили эту строчку по тексту, тем самым поставив в тупик часть читателей. <a href="http://stackoverflow.com/questions/5704914/is-a-typedef-a-definition" target="_blank">Вопрос</a>, чем же является <b>typedef</b> - объявлением или определением - поднимался и на <a href="http://stackoverflow.com/">http://stackoverflow.com</a>. Если вы не владеете достаточными знаниями английского языка, подведу краткий итог - <b>typedef</b>, согласно стандарта, является <u>объявлением</u>. Что подтверждается правилом изложенном в самой книге: "<i>В программах на C++ для каждой именованной сущности должно быть ровно одно определение. Объявлений же может быть сколько угодно</i>". Т.е. ничего не мешает написать в тесте программы:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point;
<span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point;
<span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point;
<span class="keyword">typedef</span> complex<<span class="keyword">short</span>> Point;</code></pre>
и при этом компилятор не выдаст никакой ошибки.</div>
<div style="text-align: justify;">
С учетом того, что <b>typedef</b> задает лишь новое имя (синоним) для типа данных, а не создает какие-либо переменные или сами новые типы, то выполнить условия задания (переделав объявление в определение) представляется лишь созданием нового типа:</div>
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">class</span> Point: <span class="keyword">public</span> complex<<span class="keyword">short</span>>{<span class="comment">/*...*/</span>};</code></pre>
<div style="text-align: justify;">
либо созданием экземпляра <b>Point</b>:</div>
<div style="text-align: justify;">
<pre><code class="cpp" data-result="[object Object]">Point p;</code></pre>
</div>
<div style="text-align: justify;">
Пожалуй, это был единственный сложный момент в данном задании, остальное все делается проще, по уже существующей аналогии. Итак, оставшиеся <u>объявление, переделанные в определения</u>:</div>
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">int</span> error_number;
<span class="keyword">double</span> sqrt(<span class="keyword">double</span>) {<span class="comment">/*...*/</span>};
<span class="keyword">struct</span> User {<span class="built_in">string</span> name, address;};</code></pre>
<br />
И<u> определения, переделанные в объявления</u>:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">extern</span> <span class="keyword">char</span> ch;
<span class="keyword">extern</span> <span class="built_in">string</span> s;
<span class="keyword">extern</span> <span class="keyword">int</span> count;
<span class="keyword">extern</span> <span class="keyword">const</span> <span class="keyword">double</span> pi;
<span class="keyword">extern</span> <span class="keyword">const</span> <span class="keyword">char</span>* name;
<span class="keyword">extern</span> <span class="keyword">const</span> <span class="keyword">char</span>* season[];
<span class="keyword">struct</span> Date;
<span class="keyword">int</span> day(Date* p);
<span class="keyword">template</span><<span class="keyword">class</span> T> T abs(T a);
</code></pre>
Чего тут не хватает? Праааавильно, не хватает "объявлений" для:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">enum</span> Beer {Carlsberg, Tuborg, Thor};
<span class="keyword">namespace</span> NS {<span class="keyword">int</span> a};</code></pre>
<div style="text-align: justify;">
Реализовать их на C++ стандарта 2003 года не представляется возможным. Лишь в стандарте C++11 <a href="http://ru.wikipedia.org/wiki/C%2B%2B11#.D0.9F.D0.B5.D1.80.D0.B5.D1.87.D0.B8.D1.81.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F_.D1.81.D0.BE_.D1.81.D1.82.D1.80.D0.BE.D0.B3.D0.BE.D0.B9_.D1.82.D0.B8.D0.BF.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B5.D0.B9" target="_blank">появилась</a> возможность предварительного объявления перечислений, например:</div>
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">enum</span> Beer : <span class="keyword">unsigned</span> <span class="keyword">int</span>;</code></pre>
<div style="text-align: justify;">
Пространства имен же, по сути, можно только определить. Но не удивлюсь, если автор в качестве решения рассматривает вариант объявления переменной <b>а</b>:</div>
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">namespace</span> NS{<span class="keyword">extern</span> <span class="keyword">int</span> a;}</code></pre>
<br />
<br />
<b>Упражнение 3.</b><br />
<b style="text-align: justify;"><br /></b>
<b style="text-align: justify;">Напишите программу, которая выводит размеры фундаментальных типов, нескольких типов указателей и нескольких перечислений по вашему выбору. Используйте операцию sizeof.</b><br />
<br />
Комментарии излишни. Листинг:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="preprocessor">#include <iostream></span>
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;
<span class="keyword">enum</span> Absinthe{HYPNO, TUNEL, XENTA};
<span class="keyword">enum</span> Colors{GREEN, YELLOW=<span class="number">10000</span>, BLACK=<span class="number">9</span>};
<span class="keyword">int</span> main()
{
<span class="built_in">cout</span> << <span class="string">"char - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">char</span>) << endl;
<span class="built_in">cout</span> << <span class="string">"bool - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">bool</span>) << endl;
<span class="built_in">cout</span> << <span class="string">"int - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">int</span>) << endl;
<span class="built_in">cout</span> << <span class="string">"double - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">double</span>) << endl;
<span class="built_in">cout</span> << <span class="string">"int *p - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">int</span> *) << endl;
<span class="built_in">cout</span> << <span class="string">"void *p - "</span> << <span class="keyword">sizeof</span>(<span class="keyword">void</span> *) << endl;
<span class="built_in">cout</span> << <span class="string">"enum Absinthe - "</span> << <span class="keyword">sizeof</span>(Absinthe) << endl;
<span class="built_in">cout</span> << <span class="string">"enum Colors - "</span> << <span class="keyword">sizeof</span>(Colors) << endl;
<span class="keyword">return</span> <span class="number">0</span>;
}</code></pre>
<br />
<br />
<b>Упражнение 4.</b><br />
<br />
<div style="text-align: justify;">
<b>Напишите программу, которая выводит буквы 'a' - 'z' и цифры '0' - '9' и их десятичные коды. Повторите все для иных символов, имеющих зрительные образы. Выведите числовые коды в шестнадцатеричном виде.</b></div>
<br />
Листинг:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="preprocessor">#include <iostream></span>
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;
<span class="keyword">int</span> main()
{
<span class="comment">//выводим символы a-z и их десятичные коды</span>
<span class="built_in">cout</span> << <span class="string">"a - z: "</span> << endl;
<span class="keyword">for</span> (<span class="keyword">char</span> ch = <span class="string">'a'</span>; ch <= <span class="string">'z'</span>; ch++)
{
<span class="built_in">cout</span> << ch << <span class="string">" - "</span> << <span class="keyword">int</span>(ch) << <span class="string">"; "</span>;
}
<span class="comment">//выводим символы 0-9 и их десятичные коды</span>
<span class="built_in">cout</span> << endl << endl << <span class="string">"0 - 9: "</span> << endl;
<span class="keyword">for</span> (<span class="keyword">char</span> ch = <span class="string">'0'</span>; ch <= <span class="string">'9'</span>; ch++)
{
<span class="built_in">cout</span> << ch << <span class="string">" - "</span> << <span class="keyword">int</span>(ch) << <span class="string">"; "</span>;
}
<span class="comment">//выводим символы с ASCII-кодами 128-138 и их десятичные коды</span>
<span class="built_in">cout</span> << endl << endl << <span class="string">"ASCII 128 - 138: "</span> << endl;
<span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">128</span>; i <= <span class="number">138</span>; i++)
{
<span class="built_in">cout</span> << <span class="keyword">char</span>(i) << <span class="string">" - "</span> << i << <span class="string">"; "</span>;
}
<span class="comment">//выводим символы с ASCII-кодами 128-138 и их hex-коды</span>
<span class="built_in">cout</span> << endl << endl << <span class="string">"ASCII 128 - 138 in HEX: "</span> << endl;
<span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">128</span>; i <= <span class="number">138</span>; i++)
{
<span class="built_in">cout</span> << <span class="keyword">char</span>(i) << <span class="string">" - "</span> << hex << i << <span class="string">"; "</span>;
}
<span class="keyword">return</span> <span class="number">0</span>;
}
</code></pre>
<div style="text-align: justify;">
На что в этом задании стоит обратить внимание - на вывод числовых значений в шестнадцатеричном формате. В книге, до этого параграфа включительно, этот момент не раскрыт и может оказаться затруднительным тем, кто изучает C++ по ней. Чтобы изменить представление числа с десятичной формы (по-умолчанию) на шестнадцатеричную - потоку вывода (<b>cout</b>) передается манипулятор <b>hex</b>. С момента его передачи потоку и до закрытия этого потока (либо ввода иного манипулятора задающего разрядность чисел) все числа будут представляться в шестнадцатеричной форме. О том, какие еще существуют манипуляторы потоков и что они есть на самом деле, вы можете почитать <a href="http://ru.cppreference.com/w/cpp/io/manip" target="_blank">тут</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Упражнение 5.</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Каковы на вашей машине минимальные и максимальные значения для следующих типов: char, short, int, long, float, double, long double и unsigned?</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Для выполнения этого задания необходимо обратиться к параграфам §4.6 и §22.2.<br />
Листинг:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="preprocessor">#include <iostream></span>
<span class="preprocessor">#include <limits></span>
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;
<span class="keyword">int</span> main()
{
<span class="built_in">cout</span> << <span class="string">"CHAR min: "</span> << (<span class="keyword">int</span>)numeric_limits<<span class="keyword">char</span>>::min() <<
<span class="string">"; max: "</span> << (<span class="keyword">int</span>)numeric_limits<<span class="keyword">char</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"SHORT min: "</span> << numeric_limits<<span class="keyword">short</span>>::min() <<
<span class="string">"; max: "</span> << numeric_limits<<span class="keyword">short</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"INT min: "</span> << numeric_limits<<span class="keyword">int</span>>::min() <<
<span class="string">"; max: "</span> << numeric_limits<<span class="keyword">int</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"LONG min: "</span> << numeric_limits<<span class="keyword">long</span>>::min() <<
<span class="string">"; max: "</span> << numeric_limits<<span class="keyword">long</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"FLOAT min: "</span> << numeric_limits<<span class="keyword">float</span>>::min() <<
<span class="string">"; max: "</span> << numeric_limits<<span class="keyword">float</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"DOUBLE min: "</span> << numeric_limits<<span class="keyword">double</span>>::min() <<
<span class="string">"; max: "</span> << numeric_limits<<span class="keyword">double</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="built_in">cout</span> << <span class="string">"LONG DOUBLE min: "</span> <<
numeric_limits<<span class="keyword">long</span> <span class="keyword">double</span>>::min() << <span class="string">"; max: "</span> <<
numeric_limits<<span class="keyword">long</span> <span class="keyword">double</span>>::max() << <span class="string">";"</span> << endl;
<span class="built_in">cout</span> << <span class="string">"UNSIGNED min: "</span> << numeric_limits<<span class="keyword">unsigned</span>>::min()
<< <span class="string">"; max: "</span> << numeric_limits<<span class="keyword">unsigned</span>>::max() << <span class="string">";"</span>
<< endl;
<span class="keyword">return</span> <span class="number">0</span>;
}</code></pre>
<br />
<br />
<b>Упражнение 6.</b><br />
<br />
<b>Какова максимальная длина локальных имен на вашей машине? Какова максимальная длина для внешних имен на вашей машине? Есть ли ограничения на символы, которые можно использовать в именах?</b><br />
<br />
Как следует из параграфа §4.9.3 книги сам язык программирования C++ не накладывает ограничения на длину имен. Не верить этому - нет оснований. Ограничения может накладывать компилятор, линкер и т.д. Поэтому все зависит от того, какой компилятор используется для разработки и в какой операционной системе. В общем случае, в среде MS Windows компиляторы ограничивают длину имен в 2048 символов (например, <a href="http://msdn.microsoft.com/en-us/library/565w213d.aspx" target="_blank">MS Visual C++</a>, <a href="http://www2.units.it/divisioneisi/ci/tartaglia/intel/cce/cref_cls.pdf" target="_blank">Intel C++ Compiler</a>). Хотя для внешних имен, тот же Intel C++ Compiler, может использовать длину до 64 Кб. А вот по результатам тестов одного <a href="http://stackoverflow.com/questions/2682027/is-there-a-length-limit-on-g-variable-names" target="_blank">комрада</a>, компилятор g++ и вовсе не лимитирует длину имен. Т.о., чтобы ответить на этот вопрос, необходимо обратиться к документации своего компилятора.<br />
Относительно ограничений используемых символов в именах: по общему правилу разрешается использовать буквы латинского алфавита, цифры и знак подчеркивания. При этом все пользовательские имена должны начинаться с буквы. Разрешается начинать имена и со знака подчеркивания (он так же считается "буквой"), но делать этого строго не рекомендуется (во избежание конфликтов с "системными" именами).<br />
<br />
<br />
<b>Упражнение 7.</b><br />
<br />
<b>Нарисуйте граф для фундаментальных типов, поддерживаемых любой стандартной реализацией (стрелка указывает направление от первого типа ко второму, если все значения первого типа представимы переменными второго тип). Нарисуйте тот же граф, но для вашей любимой реализации.</b><br />
<br />
Для выполнения этого задания необходимо будет обратиться к параграфу §4.6 книги и к уже выполненным упражнениям 3 и 5. Автор не уточняет про использование знаковых/без знаковых типов, поэтому используем "классическую" знаковую модель типов:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">bool</span>-><span class="keyword">char</span>-><span class="keyword">short</span>-><span class="keyword">int</span>-><span class="keyword">float</span>-><span class="keyword">double</span></code></pre>
и, конечно, любимая реализация:<br />
<pre><code class="cpp" data-result="[object Object]"><span class="keyword">bool</span>-><span class="keyword">char</span>-><span class="keyword">int</span>-><span class="keyword">double</span></code></pre>
Необходимо отметить, что это справедливо для моего компилятора (MinGW g++ 4.8), но не думаю, что будет отлично от любого другого современного компилятора C++.<br />
<br />
<br />
P/s все вышеизложенное является лишь моим субъективным видением решения поставленных задач и не претендует на "истину в последней инстанции". Если Вы имеете какие-либо замечания, дополнения, etc. пишите в комментариях :-).</div>
</div>
Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com3tag:blogger.com,1999:blog-3669300237626344457.post-3703335583199578192013-02-06T11:04:00.000-08:002013-02-06T11:15:04.196-08:00Обновление компилятора MinGW<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Вы все еще обновляете MinGW путем переустановки? Тогда <strike>мы идем к Вам</strike> это заметка для Вас! Не многие знают, да что тут лукавить - я и сам не знал, что <a href="http://sourceforge.net/projects/mingw/files/MinGW/" target="_blank">программа установки</a> MinGW - <b>mingw-get -</b> ко всему прочему позволяет еще и обновлять установленное программное обеспечение.<br />
Для этого необходимо в консоли Windows (cmd.exe, справедливо, если в переменной PATH прописан путь установки MinGW) или "MinGW Shell" (по сути <a href="http://www.mingw.org/wiki/MSYS" target="_blank">MSYS</a>) выполнить сначала команду:<br />
<pre><code class="bash" data-result="[object Object]">mingw-get update</code></pre>
- для обновления локальной копии каталога репозитория. А затем, используя команду:<br />
<pre><code class="bash" data-result="[object Object]">mingw-get upgrade</code></pre>
- обновить все установленные пакеты.<br />
<br />
В более ранних выпусках MinGW, утилита <b>mingw-get</b> не позволяла обновлять сразу все установленные пакеты,а требовала указания каждого пакета вручную. <br />
<a name='more'></a>Но и для этого "тяжелого случая" нашелся свой ... "лом" :-) ... <a href="http://mingw.5.n7.nabble.com/mingw-get-upgrade-all-tp7509p29219.html" target="_blank">предложенный</a> пользователем <i>jbowler@acm.org</i> с одного из форумов <a href="http://www.nabble.com/" target="_blank">Nabble.com</a>. В этой ситуации необходимо осуществить несколько "модифицированный" вызов команды<b> mingw-get upgrade</b>:<br />
<pre><code class="bash" data-result="[object Object]">mingw-get upgrade $(mingw-get list | awk '<span class="number">$1</span>==<span class="string">"Package:"</span> && <span class="number">
$3</span>==<span class="string">"Subsystem:"</span> && NF==<span class="number">4</span>{print <span class="number">$2</span>}')</code></pre>
Правда, чтобы это сработало, вместе с MSYS должен быть установлен и<a href="http://www.mingw.org/node/48" target="_blank"> MSYS DTK</a> (или как он теперь называется в программе установки - MinGW Developer ToolKit), только вместе с ним ставится парсер <a href="http://ru.wikipedia.org/wiki/AWK" target="_blank">AWK</a>. Суть метода сводится к передаче в качестве аргумента утилите <b>mingw-get</b> списка всех возможных пакетов, которая, в свою очередь, обновляет только те из них, которые действительно установлены. Во всех остальных случаях <b>mingw-get</b> порадует Вас предупреждающими сообщениями :-).<br />
<br />
Дерзайте!</div>
</div>
Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-35581316713551085712012-08-16T03:43:00.000-07:002012-09-16T00:59:57.449-07:00Статья - Как писать разделяемые библиотеки /Ульрих Дреппер/<div dir="ltr" style="text-align: left;" trbidi="on">
Приветствую Вас, поклонники C++!<br />
<br />
<div style="text-align: justify;">
Вы знаете как создавать разделяемые библиотеки (shared libraries)? Нет? А вот Ульрих Дреппер (Ulrich Drepper) из <a href="http://ru.redhat.com/" target="_blank">Red Hat</a> не только знает, но и написал соответствующую статью - <i>How To Write Shared Libraries</i>. Дреппер, конечно, личность неоднозначная и в мире свободного программного обеспечения достаточно знаменитая. Можно по разному относится к тому, что он делает и о чем высказывается, но к идеям статьи <i>How To Write Shared Libraries</i> стоит прислушаться, принимая во внимание, что автор периодически редактирует и дополняет свое детище. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
В связи с тем, что У. Дреппер работает в *nix - среде и пишет о ней же, большинству программистов использующих исключительно коммерческие компиляторы под ОС Windows, статья, скорее всего, будет не интересна в той же степени сколько и бесполезна. Но в целях общего саморазвития - это замечательный материал в любом случае! А уж разработчики мечтающие стать отличными специалистами в области C++, просто обязаны изучить данную статью (IMHO).</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><br />
<div style="text-align: justify;">
Единственным барьером для прочтения, правда, может стать отсутствие познаний в английском языке, таков уж "чертяка" Ульрих ... не хочет писать он для нас на русском :-). Найти более-менее цельный перевод статьи мне тоже не удалось, поэтому, если Вы вдруг где-то его накопаете ... ну или сделаете сами, большая просьба кинуть ссылку на него в комментарии.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Что же Вы узнаете ознакомившись с данным трудом? А узнаете Вы много - и исторические "грабли", что лежали на пути к разделяемым библиотекам и сложности, с которыми сталкиваются уже современные программисты, а самое главное, узнаете правила, придерживаясь которых, Вы сможете более эффективно проектировать и создавать свои библиотеки. Да и <a href="http://en.wikipedia.org/wiki/Name_mangling" target="_blank">name mangling</a> вкупе с <a href="http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9" target="_blank">ABI</a> уже не будут Вас так пугать. Заинтересованы? Тогда вперед читать :-)<br />
<br />
Лицензия статьи запрещает ее дистрибуцию, поэтому на странице <a href="http://cppstock.blogspot.com/p/d.html" target="_blank">Документация</a>, Вы найдете постоянную ссылку на ее первоисточник, так сказать, "от автора".<br />
<br />
На этом все. До новых встреч! :-)</div>
<div style="text-align: justify;">
<br /></div>
</div>
Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-73527929117728679392012-05-10T06:32:00.000-07:002012-05-10T06:32:14.121-07:00C++ компилятор TenDRA<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Про этот компилятор так и хочется сказать "военные технологии на службе мирного разработчика" :-), а все потому, что изначально был разработан в Агентстве Оценок и Исследований в области Обороны Великобритании (DERA). Собственно, часть названия "DRA", очевидно, стоит рассматривать как аббревиатуру Агентства оборонных исследований той же Великобритании (<a href="http://en.wikipedia.org/wiki/Defence_Research_Agency" target="_blank" title="Defence Research Agency">Defence Research Agency</a>) - в 1995 году вошедшей в структуру DERA. Уж не знаю зачем им потребовалось создавать свой компилятор, но видимо эта причина исчерпала себя в 2001 году, когда уже сама DERA претерпела изменения разделившись на две новые структуры: коммерческую фирму <a href="http://www.qinetiq.com/" target="_blank">QinetiQ</a> и Лабораторию оборонной науки и техники (вольный перевод <a href="https://www.dstl.gov.uk/" target="_blank">Defence Science and Technology Laboratory</a>) (не говоря уже про то, что сама разработка была приостановлена еще в 1998 году). Видимо окончательно убедившись в отсутствии "красной угрозы" правительство "Её Величества" отправило "оборонку" на вольные хлеба - зарабатывать самостоятельно :-). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Но вернемся к компилятору TenDRA. В 2002 году, где-то так в августе, сей продукт стал предметом активной разработки и распространения (под BSD-подобной лицензией) Jeroen Ruigrok van der Werven'а (боюсь переводить с голландского :-)), благо оригинальный <a href="http://en.wikipedia.org/wiki/Crown_copyright" target="_blank">Crown Copyright</a> это вполне позволял.</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><div style="text-align: justify;">
Для этих целей был создан сайт <u>tendra.org</u>, который в настоящий момент уже не функционирует. Поэтому всем, кто желает пообщаться с комрадом Йеруном, стоит обратиться к <a href="https://plus.google.com/114947073093291043753/posts" target="_blank">его страничке</a> в Google Plus.</div>
<br />
<div style="text-align: justify;">
Естественно, со временем, проект tendra.org нашел своих единомышленников - оно и понятно - сообществу свободного программного обеспечения требовался качественный компилятор с более свободной лицензией чем GPL (и тут все как-бы вспомнили GCC :-)). Да так активно стал народ включаться в работу, что в августе уже 2003 года проект разделился на два: <u>tendra.org</u> и <u>ten15.org</u>. К сожалению, все благие начинания так ни к чему и не привели - ни тот, ни другой так и не выпустили полноценную версию компилятора с полной реализацией C++. Последние вести обоих сайтов обещали "скоро" прикрутить реализацию STL, но этого так и не произошло - все заглохло в 2006-2007 годах. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Сейчас еще можно встретить в некоторых BSD-подобных дистрибутивах ОС пакеты с компилятором TenDRA, хотя все прекрасно понимают, что это уже скорее "анахронизм" чем полезное ПО. Тем не менее, компилятор есть и может найти себе применение на стареньких домашних "сервачках", так любимых <strike>линуксоидами</strike> БСДешниками "старой школы" (не в обиду будет сказано ;-)), поэтому TenDRA занимает почетное место в списке компиляторов C++ на соответствующей <a href="http://cppstock.blogspot.com/p/blog-page.html" target="_blank">странице</a>. В архиве вы найдете исходные тексты последней стабильной версии компилятора от DERA (4.1.2), а так же последние snapshot'ы проектов <u>tendra.org</u> и <u>ten15.org</u>.<br />
<br />
И хотя реализация C++ в TenDRA оставляет желать лучшего, по современным меркам, конечно, вам ничего не мешает пользоваться им как хорошим компилятором C, компилирующим, зачастую, более компактный код чем тот же GCC. Дерзайте! :-)</div>
</div>Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-89984706051029606762012-02-16T02:28:00.001-08:002012-02-16T02:28:52.183-08:00xBase64 - библиотека для работы с файлами DBF<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
На странице <a href="http://cppstock.blogspot.com/p/blog-page_16.html" target="_blank">Библиотеки</a> добавлена информация о библиотеке <u>xBase64</u>, рассмотренной более подробно в <a href="http://codedchaos.blogspot.com/2011/05/c-xbase-dbf-gnu-gcc-44.html" target="_blank">другом блоге</a>. Хотя формат DBF и очень стар, но продолжает до сих активно использоваться во многих отраслях экономики (и даже в банковском секторе), поэтому и инструмент для работы с ним всегда найдет себе применение в опытных, и не очень, руках разработчика на C++.</div>
</div>Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-34738122948617851272012-02-07T23:55:00.000-08:002012-02-08T00:26:22.919-08:00Online компилятор C++ "CodePad.org"<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Конечно это сильно сказано - "online компилятор" - скорее <a href="http://codepad.org/" target="_blank">ресурс удаленной компиляции</a>. Сразу прошу обратить внимание, что поддержка языков программирования не ограничивается набором C/C++, но и включает в себе <a href="http://www.php.net/" target="_blank">PHP</a>, <a href="http://www.perl.org/" target="_blank">Perl</a>, <a href="http://www.d-programming-language.org/" target="_blank">D</a>, <a href="http://python.org/" target="_blank">Python</a> и другие (вдруг кому попутно пригодиться).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Понятное дело - серьезные проекты собрать и оттестировать там не удастся, а вот проверить работоспособность простенького кода или функции - это всегда пожалуйста. К тому же, для набранного варианта вашего исходника вы получается на него ссылку, которую можете вставить у себя в блоге, например, или на обучающем сайте - тем самым повысив интерактивность излагаемого материала :-) (<a href="http://codepad.org/bpohEelU" target="_blank">example</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Для компиляции используется знакомый всем нам <a href="http://gcc.gnu.org/" target="_blank">GNU GCC</a> (на момент написания - версии 4.1.2), поэтому особых "сюрпризов" ожидать не приходиться. Самым дотошным, все же, рекомендую предварительно посетить страничку <a href="http://codepad.org/about" target="_blank">about</a>, дабы посмотреть с какими опциями был собран g++. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Для активных пользователей сайта, тех же образовательных ресурсов, предлагается возможность <a href="http://codepad.org/mkproj" target="_blank">создания</a> собственных проектов (выдают субдомен в домене <u>codepad.org</u>), в рамках которого можно будет осуществлять совместную работу с исходными текстами.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
И в качестве "десерта" - на сайте <a href="http://codepad.org/" target="_blank">CodePad.org</a> вы найдете <a href="http://codepad.org/fizzbuzz" target="_blank">решения</a> задачи <a href="http://habrahabr.ru/blogs/htranslations/111843/" target="_blank">FizzBuzz</a> для всех представленных языков программирования ;-).</div>
</div>Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-47642514175155140852012-01-29T02:43:00.000-08:002012-01-29T02:43:36.577-08:00C++ компилятор DJGPP<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
На странице <a href="http://cppstock.blogspot.com/p/blog-page.html" target="_blank">Компиляторы</a> добавлен новый продукт - <b>DJGPP</b>. Это даже не компилятор, а целая <i>платформа программирования</i> (как гласит <a href="http://www.delorie.com/djgpp/doc/eli-m17n99.html#fn-1" target="_blank">информация</a> на сайте) основанная на части портированной версии GNU GCC. Целевой операционной системой является DOS, но ничего не мешает пользоваться ей и в ОС Windows до версии XP включительно (благодаря своей внутренней эмуляции DOS'а). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
По мнению разработчика (<a href="mailto:dj@delorie.com" style="text-align: -webkit-auto;">DJ Delorie</a>), DJGPP является отличным решением для базового изучения языка C++, поскольку позволяет с самого начала работать с "серьезным компилятором" совершенно бесплатно :-) (а не подсаживать неокрепшие умы на продукты MS, Intel, Embarcadero и т.д.). В свою очередь, решив использовать DJGPP для серьезных задач и во имя личного обогащения, рекомендуется ознакомиться с <a href="http://www.delorie.com/djgpp/v2faq/faq19.html" target="_blank">лицензионными ограничениями</a> некоторых компонентов и библиотек используемых в данном проекте - серьезная смесь GPL, BSD и прочих копирайтов. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Весьма радует информационное наполнение проекта DJGPP - видно сразу - разработчики старались осветить все проблемные вопросы потенциальных пользователей. Так что, решившим поработать с данным продуктом, есть к чему обратиться - к <a href="http://www.delorie.com/djgpp/doc/" target="_blank">документации</a> :-).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Одно только печалит во всем этом, что DJGPP находиться в стадии "творческого застоя" и когда будет продолжена разработка и будет ли вообще - не известно.</div>
</div>Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-80304092552961222942012-01-26T03:30:00.000-08:002012-01-26T03:35:17.445-08:00Популярные компиляторы последних лет<div dir="ltr" style="text-align: left;" trbidi="on">
На странице <a href="http://cppstock.blogspot.com/p/blog-page.html">Компиляторы</a> добавлены компиляторы описанные мною в другом <a href="http://codedchaos.blogspot.com/">блоге</a>, ознакомиться с текстом сообщения вы всегда можете <a href="http://codedchaos.blogspot.com/2011/04/c-ide.html">здесь</a>. Затронуты они там, правда, не все, поэтому оставшиеся кратко рассмотрим тут :-)<br />
<br />
<b style="font-family: 'Trebuchet MS', sans-serif; font-size: x-large;">AMD x86 Open64 Compiler Suite </b><span class="Apple-style-span" style="font-family: inherit;">[<a href="http://developer.amd.com/cpu/open64/pages/default.aspx">сайт</a>]</span><br />
<div style="text-align: justify;">
Как следует из названия ... это компилятор разрабатываемый небезызвестной всем компанией AMD. Тот, кто в теме "процессорных войн" Intel и AMD, сразу смекнет, что сей продукт, скорее всего, есть не что иное, как ответ концерна AMD на <i>Intel® C++ Composer XE for Linux</i> - компилятор компании Intel. И тот и другой написаны под ОС Linux, бесплатны (правда Intel'овский лишь для не коммерческого использования) и предназначены для написания приложений во всю использующих современные технологии процессоров ориентированные на многопоточность и виртуализацию. Чувствуете что это "ваше все"? Тогда парни из AMD точно не зря стараются - бегом на сайт скачивать дистрибутив :-). А мы тем временем, глянем что за зверь такой Clang.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Trebuchet MS',sans-serif; font-size: large;"><b>Clang</b></span> [<a href="http://clang.llvm.org/">сайт</a>]</div>
<div style="text-align: justify;">
Clang - подозреваю, стоит расшифровывать как C-language - о чем нам, собственно, говорит и <a href="http://clang.llvm.org/">сайт</a> этого ... продукта: "<i>C Language Family Frontend for LLVM</i>" - то бишь фронт-энд семейства языков С для <a href="http://ru.wikipedia.org/wiki/LLVM">LLVM</a>. Для нас же это означает одно - мы смело можем пользоваться им в целях компиляции своих программ написанных как на голом C, так и Objective C, C++, Objective C++. Компилятор один - поддерживаемых языков "много" - не плохое вроде бы решение :-). Особо, я думаю, Clang'у обрадуются поклонники компании Apple - выступающей основным спонсором разработки этого компилятора.<br />
BSD-like лицензия же, открывает просторы для коммерческого использования, на что уповают многие разработчики ПО под UNIX-подобные и Linux-основанные ОС. Не секрет, что создатели Clang основной целью явно поставили себе сделать "BSD-шный GCC" - о чем свидетельствуют периодические новости об очередной успешной компиляции программ под Linux и даже самого <a href="https://events.linuxfoundation.org/slides/2011/lfcs/lfcs2011_llvm_lelbach.pdf">ядра Linux</a>. Но чем особенно интересен Clang, в сравнении с тем же GCC, так это улучшенным анализатором кода, позволяющим, например, при отладке, позиционировать ошибку с точностью до символа (g++ указывает только строку в которой содержится ошибка). Классно? Мне тоже нравится :-). Учитывая темпы развития этого компилятора, я думаю, уже сейчас "поклонникам" GCC стоит обратить на Clang внимание, чтобы при случае "соскочить" на него (ярые поклонники GPL чур не в счет! :-)))).<br />
<br />
<b style="font-family: "Trebuchet MS",sans-serif;"><span style="font-size: large;">Intel<sup>®</sup> C++ Compiler</span></b> [<a href="http://software.intel.com/en-us/articles/non-commercial-software-download/">сайт</a>]<br />
Ну раз уж упомянули Intel'овский компилятор всуе, давайте и про него пару строк чиркнем :-). Торговая марка "Intel" известна всем и в особом представлении не нуждается. За многолетнюю историю развития эта компания себя зарекомендовала как "надежный прагматик", что чувствуется буквально во всем - будь то процессор или программное обеспечение. А как иначе можно расценивать тот факт, что бесплатно компилятор дают "погонять" только в некоммерческих целях и то в ОС Linux? :-) Но это, конечно же, не умаляет заслуг компании в развитии свободного программного обеспечения (чего только стоит проект MobLin->MeeGo или как его уже там ....:)))) и тем более не делает ICC плохим компилятором :-). В свое время, мне частенько приходилось слышать от своих товарищей "линуксоводов" постоянные споры о качестве компилируемого кода различных компиляторов ... и ICC занимал не последнее место :-). Многие знакомы с этим продуктом в его "платном" варианте под ОС Windows, хотя его реальную "мощь" мало кто использует в своей работе.<br />
Лично бы я отнес этот компилятор к классу "промышленных", где рациональность использования которого имеет под собой четкую основу. Хотя, может быть ошибаюсь и ICC это именно то, что нужно вам! ;-)<br />
<br />
Вот, наверное, и все более-менее ходовые бесплатные компиляторы с помощью которых можно собрать все - начиная от "калькулятора" и заканчивая операционной системой - главное - было бы желание ;-).</div>
</div>Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0tag:blogger.com,1999:blog-3669300237626344457.post-77561560374429720662011-09-17T03:48:00.000-07:002011-09-17T03:48:18.700-07:00Вместо предисловия<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Приветствую Вас в моем скромном блоге посвященному C++. Нет, это не очередная страница о проблемах и тяготах разработки программ на C++ :))) Основная цель - собрать и каталогизировать как можно больше информации о бесплатных средствах разработки на языке C++ (компиляторы, IDE, библиотеки и пр.), а так же о доступных и полезных источниках информации (книги, справки, форумы и т.д. и т.п.).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Чтож.... Поехали!!! :)))</div>
</div>
Витhttp://www.blogger.com/profile/15016975536633739620noreply@blogger.com0