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

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 524
от 14.09.2006, 18:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 388, Экспертов: 59
В номере:Вопросов: 8, Ответов: 12


Вопрос № 54761: Здравствуйте Уважаемые! Подскажите где можно достать библиотечки (а также их описание) для работы с различными архивами (arj,zip,rar и т.д.). Хочу научиться программно распаковывать архивы. Спасибо за ответы!...
Вопрос № 54773: Мне для себя нужен класс, работающий с матрицами. Вообще-то задача - решать системы уравнений, но для этого мне нужен рабочий касс с матрицами. Я написал, вроде все нормально, вот только есть проблема. Не получается вернуть значание типа Matrix. Это ...
Вопрос № 54795: Не понял смысла включения include файлов без .h расширения. Особенно вот этого: Файл: cstdio ... #ifndef _CSTDIO_ #define _CSTDIO_ #ifdef _STD_USING #undef _STD_USING #include <stdio.h> #define _STD_USING...
Вопрос № 54804: Здравствуйте. Как можно сымитировать щелчок мыши? Мне нужно сделать так, чтобы запустил программу, мышку навел на кнопку,а она "сама щелкнула" на кнопку через несколько секунд, так как будто это я сам щелкнул....
Вопрос № 54810: Извините за тупой вопрос, но всё-таки спрошу: что является аналогом дельфового TPanel или скажем Panel в VC++ .NET т.е. что-то подобное в MFC есть? ...
Вопрос № 54814: Уважаемые эксперты, подскажите мне пожалуйста как рисовать в MFC приложениях ? Например чтобы принажатии кнопки он проводил линию начало которой я могла бы задать в Edit1 а конец в другом едите. И ещё как мне вывести координаты курсора мыши в та...
Вопрос № 54819: Доброе время суток! посоветуйте плз хорошую книгу по С++ для начинающего (программирование в консольном режиме) (не там где sin cout а где printf) Благодарю!...
Вопрос № 54833: Недавно задал этот вопрос, но никто не отозвался! Так вот!!! Почему спп не понимает путь к файлу если использовать "", а "/" сробатывает нормально. То же самое происходит когда пользуешься CFileDialog'ом (.GetPathName())-...

Вопрос № 54.761
Здравствуйте Уважаемые!
Подскажите где можно достать
библиотечки (а также их описание) для работы
с различными архивами (arj,zip,rar и т.д.). Хочу научиться
программно распаковывать архивы. Спасибо за ответы!
Отправлен: 08.09.2006, 19:50
Вопрос задал: kool (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: DoubleV
Здравствуйте, 1556!
Вот здесь я точно видел что-то про зип:
http://sources.codenet.ru/?cid=9

Здесь есть информация по сжатию. Только не знаю пригодистя ли тебе:
http://ishodniki.ru/list/index.php?action=all&cat=18&show=alg-zip&pr=zip_common&start=10&limit=10

Вот здесь исходники различных компрессоров:
http://ishodniki.ru/list/?cat=6&show=cpp_arhiv

Вот сайт посвященный сжатию данных:
http://www.compression.ru/

Еще исходники, думаю сможешь найти что-нить полезное:
http://www.sources.ru/pascal/archives/index.htm

Вроде больше ссылок я не знаю, если не лень загляни в гугл, помнится мне там этого добра оч. много.
Удачи!
Ответ отправил: DoubleV (статус: 4-ый класс)
Ответ отправлен: 08.09.2006, 20:50

Отвечает: Vaga
Здравствуйте, 1556!
можно посмотреть здесь http://www.codeproject.com/useritems/LiteZip.asp. Не могу утверждать, но мне кажется, что библиотеку можно скачать. Код, по крайней мере, точно.
про Zip-архивы - здесь: http://www.codeproject.com/cpp/zip.asp
UnRar: http://www.codeproject.com/file/CUnrarDLL.asp
---------
Вольному - воля
Ответ отправил: Vaga (статус: 3-ий класс)
Ответ отправлен: 08.09.2006, 22:59


Вопрос № 54.773
Мне для себя нужен класс, работающий с матрицами. Вообще-то задача - решать системы уравнений, но для этого мне нужен рабочий касс с матрицами. Я написал, вроде все нормально, вот только есть проблема. Не получается вернуть значание типа Matrix. Это я перегружаю операторы + и *, вот там и надо вернуть матрицу. Код класса - в приложении. Проблема сейчас с операцией умножения. Логика в порядке, а вот возврат значения....

Небольшие комментарии. В файле main.cpp делается следующее (должно делаться):
создаются объекты исходной матрицы, матриц L и U, матрицы для проверки правильности.
Спрашивается исходная матрица (заполение с терминала)
делается LU разложение исходной матрицы
Полученные матрицы перемножаюся
результат присваивается еще одной матрице
потом сравнивается с исходной
-----
Ошибка вылетает при выполнении операции присвоения (потому что присваивать получается нечего). Это происходит потому что переменная Result, в методе умножения локальная. Я не знаю, как бы ее корректно вернуть.

Метод перемножения первый в приложении. Затем заголовочный фалй класса, затем сам класс и в конце главный файл, который все это юзает.

Заранее очень благодарен за помощь!

Приложение:

Отправлен: 08.09.2006, 20:31
Вопрос задал: Константин (статус: 7-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лучников Ю.В.
Здравствуйте, Константин!

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

Момент 1.

При перегрузке бинарных операторов, таких как */+/- и т.д. правосторонний параметр лучше передавать по ссылке, а не по значению. Что дает:

- Сокращается время передачи объекта (а отсюда оптимизируется скорость исполнения кода), т.к. не происходит полного копирования. Фактически передается только адрес объекта.
- Отсюда отсутствуют лишние вызовы конструкторов копирования (о нем ниже), деструкторов.
Момент 2.

Перегруженный оператор присваивания ДОЛЖЕН возвращать ссылку на объект. Тем самым становится возможным сцепление операций присваивания: A = B = C = ... = X;

Это всё рекомендации. Далее пошли важные моменты...

Момент 3.

Если в классе присутствует перегруженный оператор присваивания, если класс содержит ссылки или указатели (В вашем случае, матрица Data[][]), в классе просто ОБЯЗАН быть реализован конструктор копирования. Чего у вас не было. Отсюда и выбивало программу.

Момент 4.

Если выделяется память под одиночный объект оператором new, то он должен быть уничтожен оператором delete.
Если вы выделяете память под вектор объектов оператором new[], то вы ОБЯЗАНЫ использовать оператор delete[] для освобождения памяти векторных данных. У вас же использовался delete, что приводило к утечке памяти.
Отсюда, даю рекомендации для того, чтобы подобных ошибок у вас не возникало:

1. Выучить работу с динамически-создаваемыми объектами.
2. Разобраться детально с работой конструкторов-деструкторов (очередность их вызовов и т.д.)
3. Запомнить, что кроме конструктора, существует еще и конструктор копирования (поверхностное/глубинное копирование).
4. Разобраться с различными вариантами перегрузки операторов.
Рабочий код привожу в приложении...
УСПЕХОВ!

Приложение:

Ответ отправил: Лучников Ю.В. (статус: *Мастер-Эксперт)
Россия, Киров
WWW: нЧат - Наш Чат!
ICQ: 537913
----
Ответ отправлен: 09.09.2006, 07:01
Оценка за ответ: 5
Комментарий оценки:
Великолепный ответ! Огромное спасибо!
Насчет разобраться и подучить, это скорее вспомнить :) Я просто около 8 месяцев С++ не занимался.


Вопрос № 54.795
Не понял смысла включения include файлов без .h расширения. Особенно вот этого:

Файл: cstdio
...
#ifndef _CSTDIO_
#define _CSTDIO_
#ifdef _STD_USING
#undef _STD_USING
#include <stdio.h>
#define _STD_USING
#else
#include <stdio.h>
#endif /* _STD_USING */
#endif /* _CSTDIO_ */
Что это даёт по сравнению с традиционной схемой? Я понимаю что этот кусок делает, но не понимаю зачем так наворочено.
Отправлен: 09.09.2006, 00:46
Вопрос задал: Ромка (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: InviZ
Здравствуйте, Ромка!
Преимуществ .никаких не дает.
А отличия - в том, что все функции, к примеру, из stdio.h, будут объявлены в пространстве имен std, например std::fopen. И еще потому, что так написано в стандарте - пункт "17.4.1.2 Headers".
Тут возможен вопрос - почему бы сразу не поместить все объявления, скажем, в cstdio. Это сделано для того, чтобы обеспечить обратную совместимость с языком C.
В любом случае, в программах на C++ правильнее будет подключать файлы без .h-расширения.
Насчет других файлов, не относящихся к библиотеке C, например, STL-овских, все точно так же, только из-за стандарта...
В общем, стандарт есть стандарт, и его лучше соблюдать.
Ответ отправил: InviZ (статус: 3-ий класс)
Ответ отправлен: 09.09.2006, 10:56

Отвечает: Хватов Сергей
Здравствуйте, Ромка!

Формально - ничего.

Сделано это было во многих местах из-за обратной совместимости: в какой-то момент сменился api, и не везде совместимо, и программы, использующие обновленный должны были включать новый файл, и в то же время можно было пересобирать старые программы без изменений (правда зачастую только в теории)
Ответ отправил: Хватов Сергей (статус: 4-ый класс)
Ответ отправлен: 11.09.2006, 10:42


Вопрос № 54.804
Здравствуйте.
Как можно сымитировать щелчок мыши? Мне нужно сделать так, чтобы запустил программу, мышку навел на кнопку,а она "сама щелкнула" на кнопку через несколько секунд, так как будто это я сам щелкнул.
Отправлен: 09.09.2006, 09:26
Вопрос задал: korsar (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: InviZ
Здравствуйте, korsar!
Если используется "чистый" WinApi, то необходимо отправлять сообщение BM_CLICK:
SendMessage(hButton, BM_CLICK, 0, 0);
Где hButton - handle кнопки... Если хотите, чтобы все это эффектнее выглядело - с эффектом "нажатия" - то пошлите вместо BM_CLICK сначала WM_LBUTTONDOWN, потом вызовите задержку на 100-200 миллисекунд, а затем пошлите сообщение WM_LBUTTONUP..

Если вы используете Borland C++ Builder и VCL, тогда можно вызвать либо метод Click класса TButton, либо метод Perform (это для второго способа - чтобы отправить сообщение). Например, так:
Button1->Click();

или так:
Button1->Perform(WM_LBUTTONDOWN, 0, 0);
Sleep(100);
Button1->Perform(WM_LBUTTONUP, 0, 0);
Ответ отправил: InviZ (статус: 3-ий класс)
Ответ отправлен: 09.09.2006, 10:41


Вопрос № 54.810
Извините за тупой вопрос, но всё-таки спрошу:
что является аналогом дельфового TPanel или скажем Panel в VC++ .NET
т.е. что-то подобное в MFC есть?
Отправлен: 09.09.2006, 10:43
Вопрос задал: Maxxx (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Melamed
Здравствуйте, Maxxx
К сожалению, польного аналога компонента TPanel, в MFS не существует. Поэтому Вам придется либо писать самому аналог этого компонента, либо пользоваться вариантами, которые & #1086;тдаленно напоминают этот компонент:
Шаблон формы со стилами WS_CHILD и без рамки или с рамкой типа "Thin" и в зависимости, какие будут поставленны расширенные стили окна, такой и быдет вид панели. Если вам необходим 086; что-то наподобие TPanel сделать в шаблоне формы, то я рекомендую вам воспользоваться контролем Group Box без заголовка, поигравшись при этом расширенными стилями окна для придk 2;ния ему соответствующего вида

Желаю удачи
Ответ отправил: Melamed (статус: 4-ый класс)
Ответ отправлен: 09.09.2006, 13:36


Вопрос № 54.814
Уважаемые эксперты, подскажите мне пожалуйста как рисовать в MFC
приложениях ? Например чтобы принажатии кнопки он проводил линию начало которой я могла бы задать в Edit1 а конец в другом едите. И ещё как мне вывести координаты курсора мыши в таком приложении ? Зараннее спасибо...
Отправлен: 09.09.2006, 11:40
Вопрос задала: Koran (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mihasic
Здравствуйте, Koran!
Ну, рисовать принято в OnPaint'е, рисовать при помощи объекта CDC (у него много методов, в т.ч. MoveTo и LineTo), который связан с контекстом устройства (Device Context) данной формы.
Координаты курсора мыши можно выводить, например в какой-нибудь Static в виде текста по событию MouseMove (WM_MOUSEMOVE), как в MFC уже не помню, но найти не сложно.

Кстати, чтобы присвоить (связать) переменную со статиком, нужно как минимум присвоить ему уникальное имя (внутри данного диалога), т.е. IDC_STATIC не подойдет.
(по крайней мере так было еще когда я использовал MFC в VC++6).
Ответ отправил: Mihasic (статус: 7-ой класс)
Ответ отправлен: 09.09.2006, 13:32

Отвечает: AlexKlaip
Здравствуйте, Koran!

Например:

//обработчик нажатия Вашей кнопки
void CMyClass::OnBnClickedMyButton()
{
int x1,y1,x2,y2; //координаты начала и конца
//заполняем координаты из Edit (не знаю как они у Вас организованы)
//получаем контекст окна
CClientDC dc(this);
//устанавливаем курсор в начальную точку
dc.MoveTo(x1,y1);
//рисуем линию
dc.LineTo(x2,y2);
}

Помните, что вывод на экран зависит от режима отображения:
см. ф-ию virtual int CDC::SetMapMode(
int nMapMode
);

По поводу мыши:

void CMyClass::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CString str;
str.Format("X: %d Y: %d",point.x,point.y);
//куда выводить это Вам решать, в данном случае прямо в контекст окна
//в координаты 10, 10
dc.TextOut(10,10,str);

CWnd::OnMouseMove(nFlags, point);
}
Ответ отправил: AlexKlaip (статус: 2-ой класс)
Ответ отправлен: 11.09.2006, 10:12
Оценка за ответ: 5


Вопрос № 54.819
Доброе время суток!
посоветуйте плз хорошую книгу по С++ для начинающего
(программирование в консольном режиме)
(не там где sin cout а где printf)
Благодарю!
Отправлен: 09.09.2006, 12:13
Вопрос задал: sexy (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Mihasic
Здравствуйте, sexy!
Ну, printf это сишная функция и соответственно книгу по си нужно, хотя например я начинал книги Герберта Шилдта "Полный справочник по C++", которая до сих пор лежит в столе... А после нее уже можно переходить на что-то поглубже, вроде Джефа Элджера "C++ для профессионалов".

Справочник Шилдта организован почти как учебник и в то же время в нем легкая "навигация", так что для начинающего самое оно. Плюс в нем есть разделение на C и C++.
Ответ отправил: Mihasic (статус: 7-ой класс)
Ответ отправлен: 09.09.2006, 13:38


Вопрос № 54.833
Недавно задал этот вопрос, но никто не отозвался!
Так вот!!! Почему спп не понимает путь к файлу если использовать "",
а "/" сробатывает нормально. То же самое происходит когда пользуешься CFileDialog'ом (.GetPathName())- вроди бы путь нормальный, но ....
Отправлен: 09.09.2006, 17:43
Вопрос задал: Maxxx (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Melamed
Здравствуйте, Maxxx!
Так как в С++ символ является частью специальных символов (например - перевод но новую строку, - табуляция и т.д.) то там, где тебе в строке надо ставить символ , ставь \ (кстати \ - тоже специальный символ, который при компеляции преобразуется в 86;диночную ).

Желаю удачи
Ответ отправил: Melamed (статус: 4-ый класс)
Ответ отправлен: 09.09.2006, 18:17

Отвечает: Vaga
Здравствуйте, Maxxx!
символ "" (Esc) является управляющим, поэтому правильно будет оформить так: "C:\WorkDir\MyProg".
---------
Вольному - воля
Ответ отправил: Vaga (статус: 3-ий класс)
Ответ отправлен: 09.09.2006, 21:12


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное