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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 18:51   #1
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию Нуждаюсь в идее.

Добрый вечер.

Являясь неотесанным бруском, ищу хороший топор, который бы сделал из меня что-то хорошее ) Иными словами нуждаюсь в вашем опыте.

У меня есть несколько функций. В программе они вызываются друг за другом и мне важно отследить в каком порядке они идут.
Грубо говоря, мне нужно реализовать конвейерную обработку, поэтому и важен их порядок следования.
Я остановился на идее сделать вектор функций и передавать его на обработку в другую функцию.

Это выглядит так:
Код:
enum functionsList
{
	func0 = 0,
	func1 = 1,
	func2 = 2,
	func3 = 3	
};
Далее определяю структуру, из которых будет состоять мой вектор:

Код:
struct operationType
{
	functionsList functionId;
	vector<void*> args;
};
И дальше в нужном мне месте создать подобный вектор типа operationType и передать его в некую функцию на обработку.
Однако, аргументы у функций в перечислении не типа void*, но все одинаково типа. Хочется избавиться от приведения типов и, возможно, кто-то занимался подобным, как оптимизировать данный код, чтобы максимизировать быстродействие?
Спасибо.
Glaciuse вне форума Ответить с цитированием
Старый 20.06.2012, 19:01   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Glaciuse
Цитата:
Нуждаюсь в идее.
Цитата:
У меня есть несколько функций. В программе они вызываются друг за другом и мне важно отследить в каком порядке они идут.
в порядке их вызова, очевидно же.

непонятно, что ты хочешь, но вот пример вызова функций из вектора
Код:
#include <iostream>
#include <vector>

using namespace std;

typedef vector<void (*)(void)> FooVector;

void foo1()
{ cout << "foo1 called" << endl; }

void foo2()
{ cout << "foo2 called" << endl; }

void foo3()
{ cout << "foo3 called" << endl; }

void process(const FooVector &v)
{
	for (size_t i = 0; i < v.size(); i++) {
		cout << "calling function number " << i << endl;
		v[i]();
	}
}

int main()
{
	FooVector v;
	v.push_back(foo1);
	v.push_back(foo2);
	v.push_back(foo3);
	process(v);
	return 0;
}
http://ideone.com/KMHTA
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.06.2012, 19:19   #3
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию

Прошу прощения за опечатку, но не вижу интерфейса для смены названия темы.

Вы все правильно поняли и пример ваш - как раз то, что я делаю.
Является ли это оптимальным решением данной проблемы?
Каждая моя функция состоит из 3х ступеней:
a - операция с памятью.
b - вычисление
c - операция с памятью

Если я буду вызывать их просто подряд получится такая схема:
a1 b1 c1 a2 b2 c2
А у меня есть возможность (дабы аппаратура позволяет) распараллелить эти 3 ступени и получить следующую схему:
a1 a2 b1 b2 c1 c2,
что в моем случае поднимет быстродействие вдвое.
Все сводится к тому, чтобы пользователь выбирал нужные ему функции, для запуска по подобной схеме конвейеризации, затем и нужно отслеживать порядок запуска функций.
Glaciuse вне форума Ответить с цитированием
Старый 20.06.2012, 20:35   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Это - плохое решение. Как минимум - переусложнение понимания процесса.
Хорошее решение: то, что должно запускаться строго в определенной последовательности всегда должно запускаться в этой строгой последовательности:

Инкапсулируй небезопасные функции в частной зоне какого нибудь механизма, у которого будет только один безопасный публичный интерфейс. Механизм сам позаботится об очередности вызовов небезопасных функций.
_Bers вне форума Ответить с цитированием
Старый 20.06.2012, 20:47   #5
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию

Спасибо, я подумаю над этим.
Glaciuse вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
графы(нуждаюсь в идее или объясните готовый код) shash Помощь студентам 2 14.05.2010 00:07
Обновить саму себя - Программа запускается, качает обновление и, по идее, переписывается поверх cybviolence Общие вопросы Delphi 3 07.04.2010 13:37
Сортировки на идее выбора andis Помощь студентам 4 06.03.2010 22:58
Cходящийся ряд (программа по идее должна работать но почему не работает понять не могу) в С++ Vultar Помощь студентам 3 17.12.2009 13:04