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

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


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

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

Выпуск № 576
от 08.11.2006, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 408, Экспертов: 49
В номере:Вопросов: 6, Ответов: 10


Вопрос № 61037: Уважаемые эксперты, подскажите, пожалуйста, как в MFC рисовать линии со стрелками на обоих концах? например - http://img155.imageshack.us/img155/9075/examplees5.jpg...
Вопрос № 61044: Здравствуйте уважаемые! Пишу COM-компоненту с использованием ATL. Создал проект с помощью мастера в MSVS 6.0, включил поддержку MFC. Ну все как обычно, добавил ATL объект. Добавил в него метод. Проверил параметры, передаются корректно, вызов раб...
Вопрос № 61053: Здравствуйте. Подскажите, можно ли в этом случае (в приложении) поменять malloc()/free() на new/delete? Если можно, то как. Сам я боюсь эксперементировать. Спасибо....
Вопрос № 61070: Здравствуйте, уважаемые эксперты! У меня вызвала затруднение такая задачка: нужно определить, является ли список зацикленным. то есть каждый элемент указывает на следующий, и нужно определить, не указавает ли какой-либо из элементов на элемент эт...
Вопрос № 61071: Здравствуйте уважаемые эксперты. Пишу в Borland C++ Builder 6.0. Столкнулся с такой проблемкой. Есть список определенных строковых значений. Приложение визуализирует данные таблици базы данных с помощью компонента DBGrid. Этот компонент облад...
Вопрос № 61111: Здравствуйте. У меня следующая задача: нужно изменить размер jpg-а. То есть я открываю, скажем, файл file.jpg (c высотой 1000 и шириной 2000 пикселей) и мне нужно уменьшить высоту до 640, ширину до 480 и сохранить. Казалось бы нет ничего про...

Вопрос № 61.037
Уважаемые эксперты, подскажите, пожалуйста, как в MFC рисовать линии со стрелками на обоих концах?
например - http://img155.imageshack.us/img155/9075/examplees5.jpg
Отправлен: 02.11.2006, 14:53
Вопрос задала: Holidayinn (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergey A. Wedensky
Здравствуйте, Holidayinn!
В MFC никак. Да и вообще MFC здесь ни при чем. MFC - набор wrapper-классов для вызовов функций WinAPI. А в WinAPI (точнее в GDI API) нет средств рисования стрелок - только линии. Так что рисуйте сами ;)
Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 15:29


Вопрос № 61.044
Здравствуйте уважаемые!
Пишу COM-компоненту с использованием ATL. Создал проект с помощью мастера в MSVS 6.0, включил поддержку MFC. Ну все как обычно, добавил ATL объект. Добавил в него метод. Проверил параметры, передаются корректно, вызов работает. Так вот компонент должен через протокол HTTP получать некую информацию с сайта. Использую MFC класс CSocket для обмена данными с сервером. Пробывал в обычном приложении кодуха работает, инициализацию вроде делаю. А вот в компоненте MFC начинает сыпаться как трухлявая старуха. Сбой идет при вызове функции CSocket.Create(), пишет Debug Assertion failed. Хотя самое интересное в том что попытался во время отладки жать кнопку повтор, после двух нажатий все сработало данные удавалось скачать, а запускаю без отладки после нескольких нажатий повтора, контейнер просто падает! Access violation пишет нехороший. Если есть идеи буду благодарен.
Отправлен: 02.11.2006, 16:26
Вопрос задал: ATan (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: estiGi
Здравствуйте, ATan!
Ну, самая первая идея, которая приходит в голову - зайти дебаггером внутрь CSocket.Create (), посмореть, где падает - класс же открытый - и посмотреть, какую ошибку генерирует АПИ. Если нет возможности пройти дебагом, скопировать этот кусок кода в обычное приложение и пройти дебаггером :))
А вообще используйте не МФС-обертку, а Windows Sockets напрямую, нифигули там сложного нет.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 02.11.2006, 16:41
Оценка за ответ: 4
Комментарий оценки:
Понимаешь, я там и дебаггером проходил в такую глубь залазил, что сам потерялся где я и кто я. А вылетает на функции AttachHandle в классе CAsyncSocket на коде
CSocketWnd* pWnd =
new CSocketWnd;
pWnd->m_hWnd = NULL;
if (!pWnd->CreateEx(0, AfxRegisterWndClass(0). С API возни больше, я хотел как говориться быка за рога. Не получилось :-(


Вопрос № 61.053
Здравствуйте. Подскажите, можно ли в этом случае (в приложении) поменять malloc()/free() на new/delete? Если можно, то как. Сам я боюсь эксперементировать. Спасибо.

Приложение:

Отправлен: 02.11.2006, 19:57
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Bob Johnson
Здравствуйте, Lameruga!
а зачем?
new предназначен для выделения типизированной памяти (вызывает конструктор если надо), а malloc - просто выделять память заданного объема. тебе тут больше подходит вариант с заданным объемом, т.к. единого типа у тебя нет (одна структура плюс несколько других).
знак "+" складывает размеры структур, которые тебе нужны
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 02.11.2006, 21:00
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое, все понятно.

Отвечает: Sergey A. Wedensky
Здравствуйте, Lameruga!

Полностью согласен с Bob Johnson, однако если очень надо, то можно, конечно:
region_data = (LPRGNDATA) new char[sizeof(RGNDATAHEADER) + num_rects * sizeof(RECT)];
...
delete [] (char*) region_data;
Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 10:32
Оценка за ответ: 5


Вопрос № 61.070
Здравствуйте, уважаемые эксперты! У меня вызвала затруднение такая задачка: нужно определить, является ли список зацикленным.
то есть каждый элемент указывает на следующий, и нужно определить, не указавает ли какой-либо из элементов на элемент этого же списка. Если нет, то последний элемент содержит указатель на 0. Размера списка мы не знаем.
И еще требованием является минимальное использование дополнительной памяти, то есть вариант сохранить в массиве все пройденные элементы списка и потом сравнивать с последующим, не подходит :(
Помогите пожалуйста!
Отправлен: 02.11.2006, 22:09
Вопрос задала: Alena (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: n0name
Здравствуйте, Alena!
Если задача состоит только в том, чтобы проверить зациклен ли список, то я бы при прохождении очередного элемента занулял бы указатель на следующий. То есть примерно так.

LIST_ENTRY *cur, next;

while (cur->Next){
next = cur->Next;
cur->Next = NULL;
cur = next;
}
Ответ отправил: n0name (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 23:03

Отвечает: Madproger
Здравствуйте, Alena!

А если немного модифицировать предыдущий ответ чтобы не терять элементы списка, ведь мы его делали не просто так...

Для это примем что указатель имеет тип int (практически так оно и есть)
Тогда

LIST_ENTRY *cur, next;

for(int i=1;; i++)
{
next = cur->Next;
// Достигли конца списка
if(!next)
{
cout << "Не зациклен!" << endl;
break;
} // Указатель на след элемент списка
else if(next > 0)
{
// Метим что мы уже здесь были
cur->Next *= (-1);
cur = next;
}
else if(next < 0) // Мы здесь уже были
{
cur->next *= (-1);
cout << "Список зациклен! На элементе номер: " << i << endl;
break;
}

Не проверял но что то типа этого
И список проверяем и не теряем его
---------
И будет вам счАстиЕ!
Ответ отправил: Madproger (статус: 9-ый класс)
Ответ отправлен: 02.11.2006, 23:55

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

Без использования памяти - никак. Придется либо хранить список посещенных элементов, либо что-нибудь записывать в сами элементы, причем поле под запись должно быть проинициализировано заранее.

Только если у вас все элементы влезли в память, то дополнительный список указателей на них я думаю тоже влезет. :-)
Ответ отправил: Хватов Сергей (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 16:06

Отвечает: Bob Johnson
Здравствуйте, Alena!
не, что-то вы тут брет написали, ребята...
первому аффтару - невозможно будет определить зациклен ли список, т.к. в любом случае мы найдем null.
второму - указатель не имеет знака, его нельзя проверять на < 0 или > 0, и умножать на -1 тоже нельзя. даже если ты приведешь его к типу integer, он теоретически может быть больше 0x80000000, что будет выглядеть как отрицательное число.
применение дополнительной памяти, конечно, ситуацию исправит, но если в условии написано, что нельзя - значит нельзя.
мое предложение такое:

list_elem - это тип элемента списка. пусть у него будет свойство
list_elem *list_elem::next; - указатель на следующий элемент

list_elem *CheckList (list_elem *begin)
{
list_elem *current = begin;
list_elem *next = 0;
list_elem *prev = 0;

while (current->next)
{
next = current->next;

if (next == begin)
return 0;

current->next = prev;

prev = current;
current = next;

}

current->next = prev;
return current;
}


т.е. алгоритм такой - мы идем по списку вперед, одновременно переворачивая его задом-наперед (т.е. текущий элемент начинает указывать на предыдущий, а не на следующий). если же встретится циклическая ссылка, то (за счет того, что направление пройденного списка мы перевернули) мы в конечном счете придем к самому первому элементу, что можно выяснить простым сравнением.
дополнительное преимущество данного метода - если список все же был нормальным (без циклических ссылок), то функция его не испортит (просто перевернет задом наперед) и вернет указатель на последний элемент.
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 03.11.2006, 18:26
Оценка за ответ: 5


Вопрос № 61.071
Здравствуйте уважаемые эксперты.
Пишу в Borland C++ Builder 6.0.
Столкнулся с такой проблемкой. Есть список определенных строковых значений. Приложение визуализирует данные таблици базы данных с помощью компонента DBGrid. Этот компонент обладает свойством PickList, который позволяет в некоторм роде автоматизировать ввод значений в DBGrid-е. Этот списочек можно задать вручную. Но как мне подгрузить в него мои строковые значения на этапе выполнения программы?
Пробовал использовать код указанный в приложении, но безрезультатно. Постоянно выдается ошибка "[C++ Error] _MainForm.cpp(26): E2193 Too few parameters in call to '_fastcall TDBGridColumns::GetColumn(int)"
Уже не знаю за что хвататся, помогите пожалуйста.
Если такую загрузку выполнить возможно, то хотелось бы получить ответ на еще один вопрос. Как сделать так, чтобы при вводе значения в поле, выполнялась подстановка и в упомянутом PickListе выбиралась строка которая больше всего подходит к тому, что вводит юзер? Есть ли какие-то стандартные ф-ции параметры или же нужно реализовывать такую вещь самому?
Буду оч признателен за любую помощь.

Приложение:

Отправлен: 02.11.2006, 22:29
Вопрос задал: Юра (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: JohnP
Здравствуйте, Юра!
Определение Items выглядит так:
__property TColumn* Items[int Index] = {read=GetColumn, write=SetColumn};
Items является __property, и при его чтении вызывается метод GetColumn с параметром Index.
Т.е. обращаться нужно к примеру так:
Grid->Columns[0].Items[0]->PickList->Add( str );
Насчет автоматического выбора строки из PickList,
думаю, придется делать это самому. Хотя точно не уверен.
Могу только подсказать, что Windows использует подобную вещь,
реализованную оконным классом с именем "Auto-Suggest Dropdown".
Удачи!
Ответ отправил: JohnP (статус: 2-ой класс)
Ответ отправлен: 03.11.2006, 01:10


Вопрос № 61.111
Здравствуйте.
У меня следующая задача: нужно изменить размер jpg-а. То есть я открываю, скажем, файл file.jpg (c высотой 1000 и шириной 2000 пикселей) и мне нужно уменьшить высоту до 640, ширину до 480 и сохранить.
Казалось бы нет ничего проще, но не выходит каменный цветок. Желательно готовый код (наверняка я не единственный столкнулся с такой задачей) для CBuilder.
Отправлен: 03.11.2006, 09:43
Вопрос задал: Rusland (статус: Специалист)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sergey A. Wedensky
Здравствуйте, Rusland!

Проще всего использовать GDI+ (в WinXP/2000/2003 входит в поставку ОС, для более ранних версий можно свободно распространять gdiplus.dll). Пример в приложении. Если нет header'ов и библиотек GDI+ (у меня в BCB5 их не оказалось), header'ы можно взять из VS либо скачать у Microsoft (придется подправить немного в паре мест), а библиотеку импорта создать IMPLIB'ом из gdiplus.dll.

Удачи!

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 10:35


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное