Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генерирование функций, или привязывание параметров к функциям 
V
    Опции темы
Леопольд
Дата 3.11.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Lipetsk @  3.11.2011,  11:43 Найти цитируемый пост)
А мне и не нужно ООП
например, мне нужно в классе вызвать DdeInitialize и передать ему уникальную callback функцию, привязанную к экземпляру класса, а не статическую.
Без ООП переносимого решения не получить.



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Lipetsk
  Дата 3.11.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(Леопольд @  3.11.2011,  10:58 Найти цитируемый пост)
Без ООП переносимого решения не получить.

А директивы компилятора на что?
PM   Вверх
bsa
Дата 3.11.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Lipetsk @  3.11.2011,  14:30 Найти цитируемый пост)
А директивы компилятора на что? 

какие например? И вообще, какие стандартные (читай переносимые) директивы компилятора ты знаешь?
PM   Вверх
math64
Дата 3.11.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Как раз важно сколько экземпляров функции нужно создать. если оно ограничено, то можно.
Код

typedef int (*pfunc)(void);
int results[16];
int usedmask = 0;
int f0(void) { return results[0]; }
int f1(void) { return results[1]; }
int f2(void) { return results[2]; }
...
int f15(void) { return results[15]; }
func functions[] = { f0, f1, f2, ..., f15};
func generator(int res) {
  for(int i=0; i < 15; i++) {
    if ( (usedmask & (1 << i)) == 0) {
      usedmask |= 1 << i;
      results[i] = res;
      return functions[i];
    }
  }
  return NULL;
}
void freegenerated(func f) {
  for(int i=0; i < 15; i++) {
    if (functions[i] == func) {
      usedmask &= ~(1 << i);
    }
  }
}


Это сообщение отредактировал(а) math64 - 3.11.2011, 14:08
PM   Вверх
mes
Дата 3.11.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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



--------------------
PM MAIL WWW   Вверх
mes
Дата 3.11.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

Добавлено через 56 секунд
насчет невозможности переносимого решения, написано не (совсем ) правда.. 





--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.11.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Lipetsk, объясни нормально задачу. не верю я что тебе реально нужен генератор каких-то функций.
PM WWW   Вверх
baldina
Дата 3.11.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



имхо ему нужно доп. параметры в колбэк передавать, а DdeInitialize такой возможности не предоставляет. Вот и выдумывает "генерацию функций"
PM MAIL   Вверх
bsa
Дата 3.11.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lipetsk, скорее всего, такое сделать просто нельзя, так как предполагается, что DdeInitialize вызывается единожды для приложения (я ошибаюсь?), поэтому все данные коллбэка должны быть статическими, так как он един для всего процесса. Если ты не знаешь, как это сделать с классами - почитай про PIMPL.
PM   Вверх
Lipetsk
  Дата 3.11.2011, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(math64 @  3.11.2011,  12:05 Найти цитируемый пост)
Как раз важно сколько экземпляров функции нужно создать. если оно ограничено, то можно.

суть такая, но нужна динамика, а не фиксированный набор функций


Цитата(bsa @  3.11.2011,  14:04 Найти цитируемый пост)
DdeInitialize вызывается единожды для приложения

возможно, что вызов DdeInitialize "затирает" предыдущий вызов, проверить смогу только в понедельник
но можно придумать и другие варианты задач, когда такое необходимо, и меня интересует, как такое реализовывается
пусть DdeInitialize можно вызывать несколько раз, как тогда быть?

но я уже кое-что нашел
http://www.hackcraft.net/cpp/windowsThunk/
и
http://www.codeproject.com/KB/cpp/Thunk_uses.aspx

PM   Вверх
mes
Дата 3.11.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lipetsk @  3.11.2011,  21:33 Найти цитируемый пост)
но я уже кое-что нашел

в примерах идет отражение хэндлов системы на указатели клиента.. Это не совсем то что вы описывали вначале.. 
под ваше описание подходят несколько вариантов задач, чтобне перебирать все, желательно бы от Вас услышать более точное условие. 




--------------------
PM MAIL WWW   Вверх
Lipetsk
Дата 4.11.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Вот мое точное условие
Цитата(Lipetsk @  3.11.2011,  05:51 Найти цитируемый пост)


В случае, когда функции не генерируются динамически, а создаются заранее получается примерно так (мне это не нужно, даю ссылку для лучшего понимания задачи)
Цитата(math64 @  3.11.2011,  12:05 Найти цитируемый пост)


PM   Вверх
mes
Дата 4.11.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Lipetsk, в цитатнике текста не видно..



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.11.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.11.2011,  10:47 Найти цитируемый пост)
в цитатнике текста не видно..

все потому, что его там нет.
PM WWW   Вверх
math64
Дата 4.11.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Динамически создать функцию в условиях Windows не пролучится, даже с ассемблером, в DOS было можно примерно так:
Код

typedef int (*func)(void);
int callback(void) { return 0x1234; }
void next(void) {}

func generate(int value) {
char* start = (char*)&callback;
char* end = (char*)&next;
int len = end - start;
char* code = new char[len];
memcpy(code, start, len);
// ищем в коде 0x1234 заменяем на value
return (func)code;
}

в Windows так не получится, поскольку у сгенерированного кода не будет прав на выполнение.
PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.