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

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


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

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

Выпуск № 538
от 29.09.2006, 21:35

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


Вопрос № 56489: №56440 продолжение. Нужно написать программу для WinXP/WinCe. Объясните пожайлуста в чем смысли использования семафоров. (я знаю что это такое, но не вижу выгоды) Данные представляют собой кардиограмму, т.е. меняются достаточно быстро....
Вопрос № 56547: Помогите пожалуйста разобраться! Если ссылка указывает на указатель, который в свою очередь указывает на область динамической памяти, почему адресом ссылки оказывается стек, а не динамическая память? Почему после очищения области динам. памяти и прис...
Вопрос № 56555: Добрый день, уважаемые Эксперты! Пишу класс, позволяющий работать с джойстиками средствами DirectX. В качестве отправной точки взял пример из DirectX SDK. После создания объекта DirectInput, необходимо произвести перечисление (enumerate) подк...

Вопрос № 56.489
№56440 продолжение.
Нужно написать программу для WinXP/WinCe.
Объясните пожайлуста в чем смысли использования семафоров. (я знаю что это такое, но не вижу выгоды) Данные представляют собой кардиограмму, т.е. меняются достаточно быстро.
Отправлен: 23.09.2006, 22:27
Вопрос задал: Shtasik (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

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

Смысл в том, что когда первый поток меняет данные в то время, когда второй их обрабатывает, второй может увидеть чушь. А в худшем случае - задача полетит кувырком (например, если данные - это связанный список - класс std::list<> к примеру) в непредсказуемый момент.
Ответ отправил: Хватов Сергей (статус: 5-ый класс)
Ответ отправлен: 24.09.2006, 11:10


Вопрос № 56.547
Помогите пожалуйста разобраться! Если ссылка указывает на указатель, который в свою очередь указывает на область динамической памяти, почему адресом ссылки оказывается стек, а не динамическая память? Почему после очищения области динам. памяти и присвоению указателю другого значения, а затем создания новой динамической области, та ссылка, что была в начале имеет в себе значение последней дин. области памяти. Почему это произошло?

Приложение:

Отправлен: 24.09.2006, 17:29
Вопрос задал: SpyDi (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

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

Ссылка - это по сути адрес, но синтаксически Вы можете ее использовать
как переменную того типа, на который она ссылается:

"A reference holds the address of an object, but behaves syntactically
like an object."
/MSDN/

Вы создаете объект-ссылку статически:

int & rX = ...

Так где же ей еще создаваться, как не в стеке? Вы же говорите об
_адресе_ переменной rX!

А дальше Вы вообще выполняете незаконные действия - удаляете
динамический объект, а потом записываете по уже не принадлежащему Вам
адресу значение:

delete pX;
....
*pX = ...

Это может привести к чему угодно, в общем случае к повреждению кучи.
Ответ отправил: Sergey A. Wedensky (статус: 2-ой класс)
Ответ отправлен: 25.09.2006, 10:35


Вопрос № 56.555
Добрый день, уважаемые Эксперты!
Пишу класс, позволяющий работать с джойстиками средствами DirectX. В качестве отправной точки взял пример из DirectX SDK.
После создания объекта DirectInput, необходимо произвести перечисление (enumerate) подключенных джойстиков.
Выполняется это следующим образом (кусок из примера):
//-----------------------------------------------------------------------------
// Function-prototypes
//-----------------------------------------------------------------------------
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );
HRESULT InitDirectInput( HWND hDlg );

//-----------------------------------------------------------------------------
// Реализация
//-----------------------------------------------------------------------------
// Name: InitDirectInput()
// Desc: Initialize the DirectInput variables.
//-----------------------------------------------------------------------------
HRESULT InitDirectInput( HWND hDlg )
{
HRESULT hr;

hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&g_pDI, NULL );

hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
EnumJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY );
}

//-----------------------------------------------------------------------------
// Name: EnumJoysticksCallback()
// Desc: Called once for each enumerated Joystick. If we find one, create a
// device interface on it so we can play with it.
//-----------------------------------------------------------------------------
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance,
VOID* pContext )
{
UNREFERENCED_PARAMETER( pContext );
HRESULT hr;

// Obtain an interface to the enumerated Joystick.
hr = g_pDI->CreateDevice( pdidInstance->guidInstance, &g_pJoystick, NULL );

if( FAILED(hr) )
return DIENUM_CONTINUE;

return DIENUM_STOP;
}

Функции g_pDI->EnumDevices в качестве второго параметра передается адрес функции EnumJoysticksCallback, которая вызывается для перечисления устройств.

В примере, функции DirectX приведены как обычные функции (не методы класса).
Пример рабочий, компилируется и выполняется без ошибок.

Теперь я то же самое «заворачиваю» в методы класса:
//-----------------------------------------------------------------------------
// Function-prototypes
//-----------------------------------------------------------------------------
class CDIJoystick
{
public:
CDIJoystick();
private:
HRESULT InitDirectInput( HWND hDlg ) const;
bool Enumerate_Joysticks(void);
bool CALLBACK EnumJoyCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );
}
//-----------------------------------------------------------------------------
// Методы класса
//-----------------------------------------------------------------------------

bool CALLBACK CDIJoystick::EnumJoyCallback( const DIDEVICEINSTANCE* pdidInstance,VOID* pContext )
{
HRESULT hr;

hr = g_pDI->CreateDevice( pdidInstance->guidInstance, &g_pJoystick, NULL );

if( FAILED(hr) )
return DIENUM_CONTINUE;

return DIENUM_STOP;
}

HRESULT CDIJoystick::InitDirectInput( HWND hDlg ) const
//-----------------------------------------------------------------------------
// Name: InitDirectInput()
// Desc: Initialize the DirectInput variables.
//-----------------------------------------------------------------------------
{
HRESULT hr;

hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pDI, NULL );

hr=g_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL ,EnumJoyCallback,NULL,DIEDFL_ATTACHEDONLY);
return S_OK;
}
И вот тут начинаются проблемы:

При компиляции получаю:
error C3867: 'CDIJoystick::EnumJoyCallback': function call missing argument list; use '&CDIJoystick::EnumJoyCallback' to create a pointer to member
на функции:
hr=g_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL ,EnumJoyCallback,NULL,DIEDFL_ATTACHEDONLY);

Ладно, делаю как просят:
hr=g_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL ,&CDIJoystick::EnumJoyCallback,NULL,DIEDFL_ATTACHEDONLY);

В итоге ругательства меняются, но ругань все на ту же строку:
error C2664: 'IDirectInput8W::EnumDevices' : cannot convert parameter 2 from 'bool (__stdcall CDIJoystick::* )(const DIDEVICEINSTANCE *,void *)' to 'LPDIENUMDEVICESCALLBACKW'

Все, тут я застрял. Описание и параметры функций одинаковы с примером. В примере работает, у меня нет. Что меняется при использовании этих функций в качестве методов класса и как это лечить?

VisualStudio 2005

Спасибо!

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

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, MayBe!
В примере:
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext )
функция EnumJoysticksCallback имеет два параметра!
Компилятор вам и говорит: "function call missing argument list" - у вызова функции отсутствует список аргументов. А вы конкретизируете пространство имен, вместо того, чтобы сделать вызов ф-ии. Вот к чему дальше это "use '&CDIJoystick::EnumJoyCallback' to create a pointer to member..." - не знаю. Но баг, похоже, именно в этом. Даже если у вас аргументы бы имели значение по умолчанию - все равно скобки надо было бы писать.
---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Практикант)
Ответ отправлен: 25.09.2006, 00:56
Оценка за ответ: 2

Отвечает: dentist
Здравствуйте, MayBe!
вы не сможете передать адрес функции члена класса в качестве параметра!
используйте третью функцию со ссылкой на класс в качестве аргумента
например так:

class abc
{
};

void f_callback(LPCDIDEVICEINSTANCE v1, LPVOID * c)
{
((abc*)c)->blablabla();
}

int main(..)
{
....
abc * myclass = new abc;
EnumDevices(DI8DEVCLASS_GAMECTRL, callback, myclass, DIEDFL_ATTACHEDONLY);
...
}

таким образом, на сколько я понял из msdn, каждый раз при вызове callback из EnumDevices, ей в качестве параметра будет передаваться указатель

удачи
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 4-ый класс)
Ответ отправлен: 25.09.2006, 09:44
Оценка за ответ: 5


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

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

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

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

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

В избранное