Вопрос № 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: 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 );
}
//-----------------------------------------------------------------------------
// Методы класса
//-----------------------------------------------------------------------------
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