Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747

SetTimer и E2235 Member function must be called or its address taken

16.03.2014, 16:39. Показов 2394. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем Привет!
Прошу помочь разобраться в чём ошибка,
собственно текст программы из Архангельского "механизмы windows, сети".
Благодарю.

p.s.: C++Builder XE

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
  //
  if( idEvent = 1) {
    KillTimer(hwnd, idEvent);
  }
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 
    SetTimer(Handle, // дескриптор потока таймера
              1,           // идентификатор таймера, любое целое число
              2000,      // время
              (FARPROC)Timer); // вызываемая функция, собственно на эту строку ссылается сообщение  
                                       // E2235 Member function must be called or its address taken
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2014, 16:39
Ответы с готовыми решениями:

Си++.Выходит ошибка E2235 Member function must be called or its address taken
Не получается убрать ошибку. void __fastcall TForm1::Button1Click(TObject *Sender) { int n1; n1 = StrToInt( Edit1 -> Text...

[C++ Error] Unit1.cpp(23): E2235 Member function must be called or its address taken
Хочу открыть файл из компонента sShelllistView1 в компонент WebBrowser. пишу следующее: String FileName; FileName =AnsiString(...

ошибка [BCC32 Error] windowp.cpp(201): E2235 Member function must be called or its address taken
wc.lpfnWndProc = WndProc; windowp.cpp(201): E2235 Member function must be called or its address taken Full parser context ...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
16.03.2014, 18:31
Во-первых, не (FARPROC), а (TIMERPROC), а во-вторых - зачем в Билдере использовать API-шный таймер?
1
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
16.03.2014, 19:14  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Во-первых, не (FARPROC), а (TIMERPROC), а во-вторых - зачем в Билдере использовать API-шный таймер?
Эти типы совместимы,
пробовал и TIMERPROC, результаты те же.
API должны работать т.к. winAPI есть основа ОС.
Собственно я не говорю об обязательности использования именно winAPI,
самое главное в данном вопросе как передать в виде параметра ссылку на функцию (метод) член класса.
Желательно на данном примере SetTimer(...)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
16.03.2014, 19:17
Лучший ответ Сообщение было отмечено RefSol как решение

Решение

Цитата Сообщение от RefSol Посмотреть сообщение
пробовал и TIMERPROC, результаты те же.
И я пробовал (заодно поправил неправильный оператор сравнения):

Что я делаю не так?

Цитата Сообщение от RefSol Посмотреть сообщение
Эти типы совместимы,
Ну-ну...
Это:
C++
1
typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
и вот это:
C++
1
typedef int (FAR WINAPI *FARPROC)();
- совместимы ?
1
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
16.03.2014, 19:55  [ТС]
Благодарю за подробные разъяснения и исправления,
типы действительно значительно отличаются.
Странно почему в msdn порядок параметров SetTimer(...) отличается от C++Builder,
UINT_PTR - второй параметр
хотя типы UINT_PTR и UINT точно совместимы unsigned int
C++
1
2
3
4
5
UINT_PTR WINAPI SetTimer(
_In_opt_  HWND hWnd,   
_In_      UINT_PTR nIDEvent,   
_In_      UINT uElapse,   
_In_opt_  TIMERPROC lpTimerFunc );
как в msdn указаны: http://msdn.microsoft.com/en-u... 85%29.aspx

Пробовал запустить в соответствии с указанными исправлениями, но результат не радует,
возможно необходима настройка каких то опций в компиляторе по длине указателей (у меня Windows 32 разряда C++BuilderXE 32) или в чём то другом ошибка, благодарю.
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
16.03.2014, 22:05  [ТС]
Благодарю за подробные разъяснения и исправления,
типы FARPROC, а TIMERPROC действительно значительно отличаются.

Добавлено через 1 час 53 минуты
UI, пока ждал ответа разобрался, функция:
C++
1
2
3
4
5
VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
  if( idEvent == 1) {
    KillTimer(hwnd, idEvent);
  }
}
должна быть объявлена глобальной (вне класса), в этом случае компилируется успешно.

Но вопрос как в SetTimer передать в качестве параметра указатель на функцию-метод класса.
Если возможно покажите пожалуйста пример.
Благодарю.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
16.03.2014, 22:43
Цитата Сообщение от RefSol Посмотреть сообщение
как в SetTimer передать в качестве параметра указатель на функцию-метод класса
Аналогично: CWnd::SetTimer невозможно привязать Функцию-член класса
1
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
16.03.2014, 23:12  [ТС]
UI, как насчёт подобного кода, есть указатель в параметрах функции CreateThread на метод класса runProcess
взято от сюда (http://www.codeproject.com/Art... reads-in-C)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#pragma hdrstop
 
#include <tchar.h>
#include <iostream>
//project dependencies
#include "cthread.h"
//end project dependencies
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
  CThread* th = new CThread();
  th->CreateThread();
 
  char buf[256];
  std::cout<<"runProcess in main"<<std::endl;
  std::cin>>buf;
  std::cout<<buf<<std::endl;
  system("pause");
 
 
  return 0;
}
//---------------------------------------------------------------------------
/*
*/
 
 
 
//*********************************************************
//default constructor for class CThread
//*********************************************************
CThread::CThread ()
{
    this->hThread       = NULL;
    this->hThreadId     = 0;
    this->hMainThread   = ::GetCurrentThread ();
    this->hMainThreadId = ::GetCurrentThreadId ();
    this->Timeout       = 2000; //milliseconds
}
 
//*********************************************************
//destructor for class CObject
//*********************************************************
CThread::~CThread ()
{
    //waiting for the thread to terminate
    if (this->hThread) {
        if (::WaitForSingleObject (this->hThread, this->Timeout) == WAIT_TIMEOUT)
            ::TerminateThread (this->hThread, 1);
 
        ::CloseHandle (this->hThread);
    }
}
 
//*********************************************************
//working method
//*********************************************************
unsigned long CThread::Process (void* parameter)
{
 
    //a mechanism for terminating thread should be implemented
    //not allowing the method to be run from the main thread
    if (::GetCurrentThreadId () == this->hMainThreadId)
        return 0;
    else {
 
        return 0;
    }
 
}
 
//*********************************************************
//creates the thread
//*********************************************************
bool CThread::CreateThread ()
{
 
    if (!this->IsCreated ()) {
        param*  this_param = new param;
        this_param->pThread = this;
        this->hThread = ::CreateThread (NULL, 0, (unsigned long (__stdcall *)(void *))this->runProcess, (void *)(this_param), 0, &this->hThreadId);
        return this->hThread ? true : false;
    }
    return false;
 
}
 
//*********************************************************
//creates the thread
//*********************************************************
int CThread::runProcess (void* Param)
{
    CThread*    thread;
    thread          = (CThread*)((param*)Param)->pThread;
 
  std::cout<<"runProcess in Thread"<<std::endl;
  //system("pause");
    delete  ((param*)Param);
    return thread->Process (0);
}
Добавлено через 5 минут
UI, решения надо искать при использовании ключевого слова __closure, но каков синтаксис?
как в справке не работает.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
17.03.2014, 01:03
Цитата Сообщение от RefSol Посмотреть сообщение
как насчёт подобного кода
А ты внимательнее посмотри на код по своей ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//here we create the thread
HANDLE CThread::CreateThread ()
{
    return ::CreateThread ((NULL, 0, (unsigned long (__stdcall *)(void *))this->runProcess, 
                (void *)this, 0, NULL);
}   
 
//static method
int CThread::runProcess (void* pThis)
{
    return ((CThread*)(pThis))->Process();
}
В 8-ой строке все написано. То же самое я предлагал и по ссылке выше. Так что... Выбирай, либо static-метод, либо глобальная функция, а не метод класса.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2014, 01:03
Помогаю со студенческими работами здесь

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend
выкидывает C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend при компиляции. что делать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru