Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2010, 22:05   #1
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию Указатели на функции

Не могу понять в чем дело:

Код:
#include <iostream.h>

typedef void (*(*(*mas_func)())[3])();
typedef void (*type_func)();

void f1(){
	cout << "f1()\n";
}

void f2(){
	cout << "f2()\n";
}

void f3(){
	cout << "f3()\n";
}

type_func* func(){
	type_func* mas = new type_func[3];

	mas[0] = f1;
	mas[1] = f2;
	mas[2] = f3;

	return mas;
}

int main()
{
	mas_func pfunc = func;

	type_func* mas = (*pfunc)();

	for(int i = 0; i < 3; i++)
		mas[i]();

	delete []mas;


	return 0;
}
Данный код не работает. Пытаюсь возвратить через указатель на функцию (*pfunc)() массив указателей на функцию . Не могу понять как под такой указатель
Код:
void (*(*(*mas_func)())[3])();
реализовать похожий прототип функции. Такой:
Код:
type_func* func()
вроде правильный, ну что то он меня смущает.

Последний раз редактировалось profi; 11.07.2010 в 22:09.
profi вне форума Ответить с цитированием
Старый 11.07.2010, 22:23   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вы хотели что-то вроде этого:
Код:
#include <iostream>

using namespace std;

typedef void (*type_func)();
typedef type_func* (*mas_func)();

void f1(){
	cout << "f1()\n";
}

void f2(){
	cout << "f2()\n";
}

void f3(){
	cout << "f3()\n";
}

type_func* func(){
	type_func* mas = new type_func[3];

	mas[0] = f1;
	mas[1] = f2;
	mas[2] = f3;

	return mas;
}

int main()
{
	mas_func pfunc = func;

	type_func* mas = (*pfunc)();

	for(int i = 0; i < 3; i++)
		mas[i]();

	delete []mas;


	return 0;
}
?
netrino вне форума Ответить с цитированием
Старый 11.07.2010, 22:29   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

netrino совершенно верно. Но данный подход мне не интересен, так как он простой. Я бы хотел именно попробовать с данной конструкцией:
Код:
void (*(*(*mas_func)())[3])();
Как под именно такой указатель реализовать прототип функции. Кстати если убрать здесь [3] то все работает и это будет верно так как в прототипе
Код:
type_func* func()
не указано сколько мы возвращаем элементов.

Последний раз редактировалось profi; 11.07.2010 в 22:33.
profi вне форума Ответить с цитированием
Старый 11.07.2010, 22:53   #4
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
#include <iostream>

using namespace std;

typedef
	void (*pfunc)();
typedef
	pfunc *ppfunc;

//-----------------//

void f0(void);
void f1(void);
void f2(void);

//-----------------//
ppfunc func(void);


void main(){
	ppfunc mas=func();
	for (int i=0; i<3; i++){
		mas[i]();
	}
	delete []mas;
	cin.get();
	return;
}

void f0(){
	cout << 1 << endl;
	return;
};

void f1(){
	cout << 2 << endl;
	return;
};

void f2(){
	cout << 3 << endl;
	return;
}

ppfunc func(){
	ppfunc f = new pfunc[3];
	f[0]=f0;
	f[1]=f1;
	f[2]=f2;
	return f;
}

Последний раз редактировалось capta1n; 11.07.2010 в 23:15.
capta1n вне форума Ответить с цитированием
Старый 11.07.2010, 22:57   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

capta1n И? Читали мой пост №3?
profi вне форума Ответить с цитированием
Старый 11.07.2010, 23:15   #6
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
#include <iostream>

using namespace std;

typedef
	void (*pfunc)();
typedef
	pfunc pafunc[3];
typedef
	pafunc *ppafunc;

//-----------------//

void f0(void);
void f1(void);
void f2(void);

//-----------------//
ppafunc func(void);


void main(){
	ppafunc mas=func();
	for (int i=0; i<3; i++){
		(*(mas))[i]();
	}
	delete []mas;
	cin.get();
	return;
}

void f0(){
	cout << 1 << endl;
	return;
};

void f1(){
	cout << 2 << endl;
	return;
};

void f2(){
	cout << 3 << endl;
	return;
}

ppafunc func(){
	pfunc* f = new pfunc[3];
	f[0]=f0;
	f[1]=f1;
	f[2]=f2;
	ppafunc* ppf = new ppafunc;
	ppafunc pf=(ppafunc)f;
	ppf[0]=pf;
	return ppf[0];
}
capta1n вне форума Ответить с цитированием
Старый 11.07.2010, 23:21   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Блин ну читайте мой пост. Я понимаю, что вы знаете как это упростить. Это хорошо. Я прошу именно по данный указатель
Код:
void (*(*(*mas_func)())[3])();
реализовать прототип функции.
profi вне форума Ответить с цитированием
Старый 11.07.2010, 23:23   #8
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

что не так в программе #6

вы никогда не сможете реализовать функцию, которая смогла бы возвратить массив, функция возвращает единственное значение - будь это значение переменной или ее адрес
поэтому, чтобы возвратить массив, который невозможно возвратить как переменную (то есть весь массив), возвращают указатель на начало, чтобы потом адресоваться не только к первому элементу, а , зная размер одного элемента массива и размер массива, адресоваться к остальным его элементам

Последний раз редактировалось capta1n; 11.07.2010 в 23:26.
capta1n вне форума Ответить с цитированием
Старый 11.07.2010, 23:26   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

capta1n та все так. Я уже и ответ в посте №3 написал, как оно будет работать и что нужно для этого сделать. Я же совсем другое прошу, ну прочитайте плиз внимательно пост №3 .

Цитата:
вы никогда не сможете реализовать функцию, которая смогла бы возвратить массив, функция возвращает единственное значение - будь это значение переменной или ее адрес
Я прекрасно знаю как возвращается массив из функции. Данный пример я взял не с головы. Я сам удивился что такой указатель можно объявить. Я вот и спрашиваю, может кто-то знает ответ на данный вопрос.

Последний раз редактировалось Stilet; 12.07.2010 в 12:17.
profi вне форума Ответить с цитированием
Старый 11.07.2010, 23:32   #10
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
typedef
	pfunc pafunc[3];
я же указываю размер, в отличие от netrino

или вы хотите, чтобы было объявление

Код:
void (*(*(*mas_func)())[3])();
?
capta1n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели. Функции. Динамические массивы Exorcist2012 Помощь студентам 0 25.06.2010 01:21
указатели на функции MeGaTpoH Общие вопросы C/C++ 2 18.06.2009 16:27
Функции и Указатели на С++ Wia Помощь студентам 3 17.04.2009 14:57
Указатели. Файлы. Функции Duleks Общие вопросы C/C++ 1 15.10.2008 13:53
Указатели в функции. _LEON_ Общие вопросы C/C++ 4 04.02.2008 10:38