Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработчик прерываний  (Прочитано 5782 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ARTHES
Интересующийся

by
Offline Offline

« : 13-02-2008 16:35 » 

Пишу обработчик аппаратного прерывания, которое генерит PCI-устройство.

Код:
LRESULT CALLBACK cbfn(); // callback function declaration

void __fastcall TForm42::Button1Click(TObject *Sender)
{
        int c_1 = 10000;
        int c_2 = 1000;
        
        CheckBox1->Checked = false;

        err = DIO_INT2_EventMessage (cardID, INT2Src, NULL, NULL, (void *) cbfn);  //here ERROR appears  
    if (err!=NoError) { /* Error occurs */ }

        err = CTR_Setup(cardID, CtrNo1, CtrMode, c_1, BIN);                 //Counter 1 Setup
        if(err != NoError) { /* Error occurs */ }
        err = CTR_Setup(cardID, CtrNo2, CtrMode, c_2, BIN);                 //Counter 2 Setup
        if(err != NoError) { /* Error occurs */ }
}
//---------------------------------------------------------------------------

//callback function code body
LRESULT CALLBACK cbfn()
{
        //interrupt processing
}

ОШИБКА:

Код:
[C++ Error] Unit42.cpp(7884): E2034 Cannot convert 'void *' to 'void * (*)()'

Заранее благодарен за помощь.
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 13-02-2008 17:15 » 

Недостаточно информации по твоему вопросу. Единственное, невооруженным взглядом видно, попробуй поставить скобки:
Код:
err = DIO_INT2_EventMessage (cardID, INT2Src, NULL, NULL, (void *) cbfn());
Записан
ARTHES
Интересующийся

by
Offline Offline

« Ответ #2 : 13-02-2008 17:28 » 

Скобки не помогают, ошибка та же.

Опишу функцию DIO_INT2_EventMessage, она из документации по PCI-плате, что генерит аппаратное прерывание.
Вот что про нее написано:
...notifies the user’s application when an interrupt event occurs. The notification is performed through a
user-specified callback function or the Windows PostMessage API.

Вот ее "общий вид":
I16 DIO_INT2_EventMessage (U16 CardNumber, I16 Int2Mode, HANDLE windowHandle, U32 message, void *callbackAddr())

, где:
callbackAddr : address of the user callback function.

Объявляю я эту функцию так:

LRESULT CALLBACK cbfn(); // callback function declaration

а потом обращаюсь к ней так:

//callback function code body
LRESULT CALLBACK cbfn()
{
  //ToDo : Add your interrupt handler code here
}
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 13-02-2008 17:31 » 

навскидку...
Код:
typedef void * (*callback_type)();
...
err = DIO_INT2_EventMessage (cardID, INT2Src, NULL, NULL,  (callback_type) cbfn);
или без приведения к (void*) в вызове попробовать...
« Последнее редактирование: 13-02-2008 17:33 от Вад » Записан
ARTHES
Интересующийся

by
Offline Offline

« Ответ #4 : 13-02-2008 17:37 » 

А... вот оно как...  :Улыбаюсь

Огромное СПАСИБО за помощь
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-02-2008 17:44 » 

Ну, насколько я понимаю, от тебя требовалось передать в последнем параметре тип "указатель на функцию без параметров, возвращающую void*", приведение просто к void* компилятору явно не нравилось Улыбаюсь
Записан
ARTHES
Интересующийся

by
Offline Offline

« Ответ #6 : 13-02-2008 17:50 » 

Все правильно...

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

СПАСИБО

Записан
ARTHES
Интересующийся

by
Offline Offline

« Ответ #7 : 14-02-2008 08:20 » 

А можно еще вот так:

Код:
void *cbfn(void);
...
void __fastcall TForm42::Button1Click(TObject *Sender)
{
        ...
        err = DIO_INT2_EventMessage (cardID, INT2Src, NULL, NULL, cbfn);
        if (err!=NoError) { /* Error occurs */ }
        ...
}
...
//callback function code body
void *cbfn()
{
   //interrupt processing
}

 Да-да
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines