Форум программистов, компьютерный форум, киберфорум
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. Показов 2355. Ответов 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
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru