powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как созжать указатель на функцию
25 сообщений из 53, страница 2 из 3
как созжать указатель на функцию
    #34183211
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тогда еще один глупый вопрос, где его создать если у меня диалоговое приложение? Он по идее должен быть создан уже?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183260
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psyslnтогда еще один глупый вопрос, где его создать если у меня диалоговое приложение? Он по идее должен быть создан уже?

Смотря какая у тебя структура приложения. Создай в области видимости, где он будет использоваться.

Накрайняк создай его глобально.
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183281
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
создал глобально, прям после #includ'ов, все равно сбрасывает...
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183295
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psyslnсоздал глобально, прям после #includ'ов, все равно сбрасывает...

Показывай код
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183338
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
#include "stdafx.h"
#include "links.h"
#include "linksDlg.h"
#include <iostream>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

enum errors {BAD_BEGIN, BAD_FIRST_SECOND, BAD_DIGIT, NO_COMMA, BAD_ADD_MULT, BAD_FLOAT};


ClinksDlg obj;

/* код сгенерированный студией  */
/* еще множество моих функций */

void ClinksDlg::digit()
{
	wchar_t sep[] = _T(" \n\r,");	
	p = takeleks(NULL,sep,_T(","));
	if (p)
	{
		
		if(isxdigit(p))
			{
				m_l1 = (p);
				m_cl1.InsertString(- 1 ,m_l1);
				next_atom(&ClinksDlg::digit);
			}		
		else
		{
			throw BAD_DIGIT;
		}
	}
	else
	{
		throw BAD_DIGIT;
	}
	

}

void ClinksDlg::next_atom(void (ClinksDlg::*pfun)())
{	
	int k = wcslen(ptr);
	for (int i= 0 ; i<k; i++)
	{		
		if (*ptr!=',')
		{
			if (*ptr!=' ' && *ptr!='\r' && *ptr!='\n')
				break;
			ptr++;
			strpos++;
		}
		else
		{
			ptr++;
			strpos++;			
			(obj.*pfun)();		
		}
	}
	if (lenstr == strpos)
	{      
		throw NO_COMMA;
	}
}

...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183431
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psysln
Код: plaintext
...


Здесь, вроде, все нормально.

Ты хочешь из одного диалого управлять другим?
Что за pfun()?
Какие данные диалогов сравниваешь, если говоришь, что все сбрасывается?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183436
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может поможет для понимания?

Код: plaintext
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.
#include <stdio.h>

class A {
    private:
	int __x;
    public:
	A(int _x) {
	    __x=_x;
	}
    
	int& x() {
	    return __x;
	}
};

typedef int& (A::*Ax)();

A a( 5 );

Ax ax;
A *a2;

int main () {

    a2=&a;
    ax=&A::x;

    printf("A::x return %d\n", (a2->*ax)());

    printf("Change x to 7...\n");
    a.x()= 7 ;

    printf("A::x return %d\n", (a2->*ax)());

    return  0 ;
}

...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183443
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл в, принцепе такой.

Не обязательно использовать "a2->", можно и "a.". Это, так, для примера.
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183487
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, я не управляю другим диалогом.
pfun() - это указатель на функцию, адрес которой я передаю в next_atom(void (ClinksDlg::*pfun)())
тут получается рекурсия, т.к. я из ф-ции digit передаю указатель на неё же.
ptr и strpos у меня приватные переменные класса ClinksDlg. И когда происходит рекурсивный вызов, они почемуто сбрасываются...
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183560
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psyslnНет, я не управляю другим диалогом.
pfun() - это указатель на функцию, адрес которой я передаю в next_atom(void (ClinksDlg::*pfun)())
тут получается рекурсия, т.к. я из ф-ции digit передаю указатель на неё же.
ptr и strpos у меня приватные переменные класса ClinksDlg. И когда происходит рекурсивный вызов, они почемуто сбрасываются...

Не сбрасываются, а применяются новые. Т.к. ты вызываешь для другого объекта а не для себя. Этот obj тебе вообще не нужен. Вызывай так:

Код: plaintext
1.
(this->*pfun)();	
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183563
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
разобрался вроде как... всем большое спасибо за помощ...
сделал так : (this->*pfun)();
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183569
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держи пример:

Код: plaintext
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.
#include <stdio.h>

class A {
    private:
	int __x;
    public:
	A(int _x) {
	    __x=_x;
	}
    
	void f() {
	    printf("%d\n", __x);
	    if (__x> 0 ) {
		--__x;
		f();
	    }
	}
	
	void f2(void (A::*fun)()) {
	    (this->*fun)();
	}
};


int main () {

    A a( 5 );
    a.f();
    
    return  0 ;
}

...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183576
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psyslnразобрался вроде как... всем большое спасибо за помощ...
сделал так : (this->*pfun)();

Надеюсь, я не зря потратил время. Смысл понял?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183593
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:) Akh, да спасибо тебе, примерно понял...
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183623
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psysln:) Akh, да спасибо тебе, примерно понял...

Ну, почему "примерно". Вызывается метод класса. Какими данными будет управлять этот метод или какие данные он будет использовать? Теми, которые принадлежат объекту, который ему приписали. Ты хотел, чтобы он управлял данными объекта, который его вызывает, а давал ему другой.

Теперь, надеюсь понятно, без "примерно"?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183642
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, теперь я это понял...
еще раз спасибо, ты мне очень помог ))))
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183804
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня тут еще вопросик возник...
как мне освободить память ? если есть такая функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
wchar_t *ClinksDlg::f1(wchar_t *p)
{        
        int k = wcslen(p);
        wchar_t *tt = new wchar_t[k];
        /*
         ...
        */ 
        return tt;
}
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183875
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delete
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183928
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну это да, но его где вызвать то надо???
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183960
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delete tt;
return tt;
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34183982
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmodelete tt;
return tt;
и чтоже он тогда возвращать то будет?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34184005
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psysln maXmodelete tt;
return tt;
и чтоже он тогда возвращать то будет?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34184006
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psysln maXmodelete tt;
return tt;
и чтоже он тогда возвращать то будет?

Издеваешься?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34184059
psysln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть? не пойму я что то, так и надо что ли?
...
Рейтинг: 0 / 0
как созжать указатель на функцию
    #34184210
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
psyslnто есть? не пойму я что то, так и надо что ли?

Это зависит от структуры твоей программы. Если не знаешь какой длины будут результирующие данные, и заранее большой буфер не хочешь готовить, то можно, например, так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
wchar_t *ClinksDlg::f1(wchar_t *p, wchar_t *&tt)
{        
        int k = wcslen(p);
        tt = new wchar_t[k];
        /*
         ...
        */ 
        return tt;
}


void ClinksDlg::f() {
   ...

   wchar_t *data;
   f1(p, data);
   ... //использовал вернувшееся значение
   delete data;
}

...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / как созжать указатель на функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]