Отправляет email-рассылки с помощью сервиса Sendsay

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск No35


C/C++ Вопрос-Ответ

Выпуск      : 35
Подписчиков : 3396
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео

Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео

Анонс
Всё о ремонте и модернизации компьютера и связанного с ним оборудования. Будет только то, с чем я встретился, сделал и разобрался. Постепенно поделюсь всем своим накопленым опытом. ТОЛЬКО РАБОЧИЕ, ПОВТОРЯЕМЫЕ И НУЖНЫЕ СХЕМЫ.

Рассылки Subscribe.Ru
Ответы на все ваши вопросы
От ведущего

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.

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

Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим также может быть интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций, а также рассылка Программирование на JavaScript, в которой публикуются и описываются оригинальные скрипты, решения многих практических задач, готовые для применения на сайте.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

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

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 132 ( Pragmar )

Здравствуйте. У меня такой вопрос: как работать с файлами jpeg через MS VC++ 6.0 ?
Давно бьюсь над этой проблемой -  вроде стандартной поддержки не наблюдается,
рекомендовали сделать свой класс, но нормально работать я его так и не заставил...
Буду очень благодарен, если приведете исходник, но не откажусь и от ссылки на умный ресурс.

Ответить на вопрос

Вопрос № 133 ( Arsa )

Приветствую !

Мой вопрос наверно несколько шире чем просто вопрос по C++, однако очень хочется задать его здесь.

Вопрос такой.
Существует ряд программ, определяющих занятость/незанятость интернет-доменов и выводящих по ним информацию (кто владелец, когда зарегестрирован). Например, программе дается имя: microsoft.com, а она выводит по нему кучу информации.
Хотелось бы узнать принцип работы таких программ. Откуда они берут сведения по доменам ?

Буду благодарен любой информации - ссылкам на доки, MSDN, примеры кода.

Ответить на вопрос

Вопрос № 134 ( Arsa )

Приветствую !

Мой второй вопрос несколько созвучен с первым.
Мне хотелось бы написать свой DNS-клиент, то есть программу, узнающую по имени домена IP адрес сервера, на котором находится сайт, на который мы попадаем при наборе этого домена в браузере.
Мне хочется узнавать IP адреса в больших количествах (по списку).

Ответить на вопрос

Вопрос № 135 ( Arsa )

Приветствую !

Наконец, третий вопрос :)))
Не подскажет ли кто как работает команда ping ?
То есть, если я знаю IP адрес некоторого компа, как мне его попинговать из своей программы ?
На каком порту надо открыть сокет, и что послать, и каков должен быть ответ при пинге ?

Короче, как обычно, интересна любая информация по этому вопросу ! :)

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 128 ( Lesh )

Приветствую !

У меня такой вопросик.
Известно, что оператор new в C++ может вернуть NULL, если не хватит памяти. Однако, я читал, что этот же оператор может и выкидывать исключение. Я что то не пойму в каких случаях вылетает исключение, а в каких возвращается NULL ?
Это зависит от компилятора, или еще от чего то ?
Может, есть какие то настройки ?
Меня бы удовлетворило проверять на NULL возвращенный указатель. Но как быть с исключениями. Не писать же каждый раз что то типа:

char *p = NULL;

try
{
    p = new char[10];
}
catch(...)
{
}

if(p != NULL)
{
    ...

А хочется сделать свой код максимально ошибкоустойчивым.
Как быть ?

Ответ ( силентий )

Поведение new по умолчанию будет зависить от настроек Вашего компилятора.
Стандарт предполагает возбуждение исключения, если только не была
вызвана специальная версия new:

#include <new>
 ....
Something* ptr = new(std::nothrow) Something;

В этом случае new вернет (void*)0 aka NULL.

Ответ ( Red Devil )

Приведу открывок из книги Г. Шилдта, полный справочник по С/С++.

Поскольку объем кучи ограничен, память может оказаться исчерпанной. В
этом случае new сгенерирует исключение bad_alloc. Программа должна
перехватать исключение и обработать его. Если исключение не
перехватывать, программа будет заверешена.
...
Действие new определено стандартом языка. Проблема заключается в том,
что не все компиляторы полностью соотвествую стандарту. В ранних версиях
С++ оператор возвращал нулевой указатель.
...
В итоге было решено, что по умолчанию оператор new должен генерировать
исключительную ситуацию, однако возвращать нулевой указатель так же не
запрещается.


Я ненавижу ислючительные ситуации, считаю, что чем меньше их в программе,
тем лучше программист. Так как все можно обрабатывать и без них с
помощью if и получается гораздо красивее, хотя Страуструп в своей книге
дает очень четкий ответ зачем они нужны и когда их использовать, не буду
цитировать, интересно будет сами посмотрите. Но в данном случае я бы
сделал исключение, все таки выделение памяти штука серьезная.

Хотя честно говоря не совсем понимаю смысл перехвата и обработки такой
ситуации. Конечно если там сверхбольшие объемы, необходимо какие-то
свапы создавать, а если небольшие, можно пользователю сказать, чтобы
кильнул программки свои в трее или памяти вставил побольше.

Ответ ( Sergey Wedensky )

Вот цитата из MSDN (Июль 2003):
(естественно, касаемо компиляторов MS Visual C++)

Beginning in Visual C++ .NET 2002, the CRT's new function (in libc.lib, libcd.lib, libcmt.lib, libcmtd.lib, msvcrt.lib, and msvcrtd.lib) will continue to return NULL if memory allocation fails. However, the new function in the Standard C++ Library (in libcp.lib, libcpd.lib, libcpmt.lib, libcpmtd.lib, msvcprt.lib, and msvcprtd.lib) will support the behavior specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails.

Normally, if you #include one of the C++ standard headers, like <new>, you'll get a /defaultlib directive in your object that will reference the appropriate C++ Standard Library according to the CRT model you used (the /M* compiler options). Generally, that will cause the linker to use the throwing operator new from the C++ Standard Library instead of the nonthrowing one from the main CRT, because the order of defaultlib directives will cause libcp.lib to be searched before libc.lib (under /ML).

Even if you use one of the C++ standard library headers, it is possible to get non-throwing new. For example, compile the program below with the following command line and you will not get throwing new behavior, even though standard C++ header files are included:

cl /EHsc new_and_delete.cpp libc.lib libcp.lib
To ensure that you get the throwing version of new, link your program with thrownew.obj. In the following example, you can get throwing new behavior if you link with thrownew.obj.

cl /EHsc new_and_delete.cpp libc.lib libcp.lib thrownew.obj
Linking with thrownew.obj is only required for special circumstances where, for some reason, the linker used the non-throwing new from libc instead of the throwing one from libcp. The normal reason for the non-throw new being used is that you link with /nodefaultlib libc.lib libcp.lib. That is, you turned off the defaultlib directives that specifies what libs to use, and instead specified them manually, putting the normal CRT lib before the C++ Standard Lib. So, you can either change the command line so libcp is specified first, or add thrownew.obj explicitly.

Ответ ( Mike Patlis )

Стандарт требует выбрасывать исключение bad_alloc(), что делает ваш компилятор - смотрите в документации к нему. Если вы пользуетесь VC 2002 и выше, то это исключение. Вот что пишут в доках:

In Visual C++ .NET 2002, the new function in the Standard C++ Library will support the behavior specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails.

In Visual C++ 2005, the C Runtime Library's new function will also throw a std::bad_alloc exception if the memory allocation fails.

If you still want the non-throwing version of new for the C Runtime Library, link your program with nothrownew.obj. However, when you link with nothrownew.obj, new in the Standard C++ Library will no longer function.

В принципе не так уж трудно написать что то типа:

template <typename T>
inline T* safe_new(size_t num){
    try{
        return new T[num];
    }catch(...){
       return NULL;
    }
}

и пользоватся им вот так:

int* a = safe_new<int>(10);
if(a == NULL)
    count << "oops";

Конечно для плейсмент варианта придется написать другой код, но в 99% случаев это подойдет
Вопрос № 129 ( Nika )

Уважаемые программисты !

Я пока только начинаю осваивать C++ поэтому прошу не пинать сразу :))))

Не поделится ли кто ссылочками на теорию по бинарным деревьям.
А если эта теория будет с примерами программ на C++ будет просто здорово :))))

Или напишите пожалуйста в рассылку что это такое и с чем их едят эти деревья :))

Ответ ( силентий )

В свое время очень помог ресурс algolist.manual.ru

Ответ ( Ivan )

Здравствуйте, q.
На этом сайте можно что то полезное прочитатьhttp://www.firststeps.ru/
Вот еще ссылка это тот же самый delphiworld.narod.ru,только его переделали с
разрешения автора на C++(архив весит 40180КВ и содержит 5400 статей с
примерами)
http://www.cracklab.ru/download.php?action=get&n=NjM1
Вопрос № 130 ( strong )

Не знает ли кто где взять исходники на C++ или бесплатную библиотеку для воспроизведения mp3. Или хотя бы чтобы в wav можно было конвертировать.

Ответ ( dusha )

Салют Эл.

Существует WinAPI который умеет wav - PlaySound.
Но лучше всего использывать библиотеку fmod, bass в инете можно найти
исходники. Работают с масой изветсных форматов, потдерживают разные языки
програмирования, имеют ряд дополнительных фич.

Удачного хака.

Ответ ( силентий )

Возьмите, например, линуксовый плейер mpg321 (mpg321.sf.net)

Ответ ( Sergey Wedensky )

Могу подкинуть исходники MP3-плеера, даже с поддержкой скинов. Правда,
разбираться в коде будет не просто, хотя комментирован (по английски,
правда, надеюсь, не проблема?).

Пишите:
Сергей Введенский,
s_w<сoбaка>rambler.ru

Ответ ( Mike Patlis )

gaduio поищи от obraz studio если по винды и директ икс
Вопрос № 131 ( Ilya )

Я хотел бы задать немного философский вопрос.

Господа, как Вы думаете стоит ли сейчас писать программы на MFC, или у него совсем нет будущего ?
Сейчас все занимаются .NET. Как вы думаете, что будет с MFC лет через 4-5 ?
Будут ли вообще программы, написанные сейчас на MFC работать тогда ?

В общем, стоит ли заниматься им сейчас ?

Ответ ( Red Devil )

Очень сильно я сомневаюсь. NET очень глючная среда, и больше придуманная
для программистов delphi, java и C# - короче для программистов, которые
не умеют работать с памятью и не знают свойств и особенностей ОС,
которые не могут написать низкоуровненый интерфейс для работы с чем-либо
итд. Кроме того на .NET впринципе невозможно написать быстродействущие
приложение, CLR всю работу угробит.

Стоит только взглять на новые среды программирования - VS 2005 и сразу
становится понятно, что мелкософт идет по пути - юзер - ламер,
разработчик тоже, нужно сделать все как можно проще. Мне лично не нужна
такая простота, и куча кнопок в меню. Кроме того мышку приводится возить
раза в 3 чаще, чем с редактором VC 6. Ушь не знаю почему.

Ну и основной мой довод, почему .NET это ***, это потому что среди среди
самых популярных программ, которыми пользуются обычные пользовали,
программ на основе .NET практически нет, каламбур :) (я не знаю ни одной).
Браузеры, мейл клиенты, редакторы изображений, видео-аудио редакторы,
плееры, утилиты, антивирусы, файрволы - боюсь себе представить антивирус
на базе CLR - это будет мегатормоз.

Что, касается MFC. Для меня это удобная библиотека для создания
пользовательского интерфейса, но работу с файлами, сетью и потоками я ей
не доверяю, только интерфейс.
Будущее ее зависит от Windows, если у масдай изменят основательно,
придется тогда и новую библиотеку создавать. Пока, что все идет по
наростающей, библиотеки MFC обновляются со средой. Правда в этих
обновлениях я ничего не вижу, кроме нарастающего лишнего кода.

Между прочим Linux/Unix вообще пофиг на этот NET.
Это всешо лишь мое ИМХО, оно сложилось лишь на основе моих личных
взглядях и поняниях.

Ответ ( Sergey Wedensky )

Мне кажется, .NET еще очень сырая технология, да и не
родная на существующих ОС. Вот когда выйдут релизы VISTA или
LONGHORN... Но лично мне кажется, до этого еще далеко. Слишком
требовательно это все к ресурсам да и в security большие дыры. Вообще .NET
разрабатывался как сетевая технология и использовать ее для
программирования GUI нет смысла.

MFC же хорошо себя зарекомендовала как библиотека классов над Win32
API. Удобная в использовании, родная Мелкософтовская в конце концов.
Освоить недолго, так что, я бы сказал это на данный момент лучший
вариант (если не хочется тащить за собой VCL в Delphi или, не дай бог,
CPP Builder).

Да, а программы работать точно будут! Еще раз, MFC - всего лишь библиотека классов над
WinAPI. Это что же, на LONGHORN вообще не будет работать все
написанное на данный момент под видны???!!! На это MS врядли пойдет ;)

Так что, юзайте, имхо.

Ответ ( Mike Patlis )

Проги работать будут, чего им не работать... А будут ли писать... Кто то будет, Пройдет мода на дот нет начнется новая битва в песочнице, а С/С++ будет жить вечно :) Конкретно MFC не знаю, а WinAPI знать надо по любому.
Анонсы книг по C/C++
Операционные системы. Разработка и реализация (+ CD-ROM)
Операционные системы. Разработка и реализация (+ CD-ROM)

Автор: Э. Таненбаум, А. Вудхалл

Второе издание классического труда Эндрю Таненбаума "Operating Systems: Design and Implementation" - это единственный в своем роде учебник, в котором успешно сочетаются теория и практика построения операционных систем. В ней подробно описываются процессы и межпроцессное взаимодействие, семафоры, мониторы, передача сообщений, алгоритмы работы планировщика, ввод/вывод, разрешение тупиковых ситуаций, драйверы устройств, алгоритмы управления памятью, разработка файловых систем, а также затрагиваются вопросы безопасности и защиты данных. Но, в то же время, обсуждается и конкретная, UNIX-совместимая операционная система MINIX и приводится ее исходный код (его вы найдете на компакт-диске). Это позволяет не только изучать основополагающие принципы, но и наблюдать, как они применяются в реальных операционных системах.

Страница книги на Озоне
Практическая криптография. Алгоритмы и их программирование (+ CD-ROM)
Практическая криптография. Алгоритмы и их программирование (+ CD-ROM)

Автор: А. В. Аграновский, Р. А. Хади

Эта книга предназначена прежде всего для тех, кто интересуется не только теоретическими аспектами криптологии, но и практическими реализациями алгоритмов криптографии и криптоанализа. В книге уделено очень много внимания вопросам компьютерного криптоанализа и логике программирования защищенных криптосистем. Книга изложена таким образом, что она будет полезной как для неподготовленного читателя, так и для высококвалифицированного специалиста, желающего расширить свой кругозор и по-новому взглянуть на криптографический аспект систем информационной защиты. Речь в книге не идет о каких-то конкретных программных продуктах, наоборот - прочтя книгу, подготовленный читатель будет способен самостоятельно создавать программное обеспечение, содержащее криптографические алгоритмы.

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

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

Страница книги на Озоне
Рассылки и дискуссионные листы компьютерной тематики
Рассылки
Программирование на JavaScript

Все аспекты программирования на JavaScript - нестандартные приемы, ОРИГИНАЛЬНЫЕ скрипты, авторские статьи и наработки. "JavaScript solutions" - в каждом выпуске готовый к применению ИНТЕРЕСНЫЙ скрипт (исходный код с комментариями).

Дискуссионные листы
Программирование. Форум !!!

Самый популярный дискуссионный лист по программированию на subscribe.ru, существующий с момента открытия сервиса дискуссионных листов !

Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !

Вебстроительство. Форум !!!

В дискуссионном листе ведется обсуждение различных аспектов создания сайтов - написание скриптов, использование, настройка портальных движков, и многое другое. Присоединяйтесь !

Поисковые системы. Форум !!!

Этот дискуссионный лист посвящен обсуждению поиковых систем, методов индексации сайтов поисковиками, способам оптимизации сайта под поисковые системы.

Хостинг. Обзоры и обсуждения платного и бесплатного хостинга.

Вы ищете хостинг (платный, бесплатный) ? Хотите спросить совета в выборе ? Можете обсудить это здесь. Поделитесь советом, если знаете. Или узнайте больше. Все о хостинге.


Всего доброго. До встречи в следующем номере.

В избранное