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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сделать функцию 
:(
    Опции темы
Mormishka
Дата 21.4.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня есть функциb
Код

int f1(int x,int y,int z);


еще есть другая функция
Код

int f2((*func)(int ),int p);


как мне передать в функцию f2 функцию f1, при этом y,z фиксировано ?
PM MAIL   Вверх
bsa
Дата 21.4.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mormishka, никак. Подобное в С++ решается шаблонами и функторами
PM   Вверх
boostcoder
Дата 21.4.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



boost::bind()

Добавлено через 5 минут и 43 секунды
Цитата(Mormishka @  21.4.2011,  20:02 Найти цитируемый пост)
f1(int x,int y,int z)

Цитата(Mormishka @  21.4.2011,  20:02 Найти цитируемый пост)
(*func)(int )

тут еще кол-во аргументов не совпадает.
или так задумано?

Добавлено через 8 минут и 9 секунд
стандартное решение при помощи байндеров:
Код

#include <boost/bind.hpp>

void f1(int x, int y, int z) {}

template<typename F>
void f2(F f, int p) {
   f(p);
}

int main() {
   int x, y, z, p;
   f2(boost::bind(&f1, x, y, _1), p);
}

http://liveworkspace.org/code/94182ffea77b...f087f2e80317d3d
PM WWW   Вверх
null56
Дата 21.4.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mormishka @  21.4.2011,  20:02 Найти цитируемый пост)
при этом y,z фиксировано 

ну если они фиксированы, может как - то так?
Код

#define FIX_ARG_1 7
#define FIX_ARG_2 9

typedef int (*func)(int, int, int);

int f1(int x, int y = FIX_ARG_1,int z = FIX_ARG_2)
{
   return (x + y + z);
}

int f2(func f, int p)
{
   return f1(p, FIX_ARG_1, FIX_ARG_2); // или return f1(p);
}

int main()
{
   printf("%d\n", f2(f1, 10));
   return 0;
}



Это сообщение отредактировал(а) null56 - 21.4.2011, 20:35
PM MAIL   Вверх
Mormishka
Дата 21.4.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder

Цитата

тут еще кол-во аргументов не совпадает.
или так задумано?


Да, не совпадает.
PM MAIL   Вверх
mes
Дата 21.4.2011, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  21.4.2011,  19:18 Найти цитируемый пост)
стандартное решение при помощи байндеров:

то же, но без шаблона : 
Код
#include <functional>
void f1(int x, int y, int z) {}

void f2(std::function<void(int)> f, int p) {
   f(p);
}

int main() {
   int x, y, z, p;
   f2(std::bind(&f1, x, y, std::placeholders::_1), p);
}
http://liveworkspace.org/code/cf8e0690efb2...c702308aff3ad35

Это сообщение отредактировал(а) bsa - 22.4.2011, 13:54


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


Эксперт
****


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

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



mes, я и это тоже имел в виду под "шаблоны". На C, а так же если функция f2 принимает только указатель на функцию, то решения нет.
PM   Вверх
mes
Дата 22.4.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



bsa, я привел код не для примера, как решить задачу без шаблонов,
а чтоб тс было легче разобраться с биндом  smile 



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


Бывалый
*


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

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



mes
По-моему вы не совсем меня поняли.

Код

int f1(int x,int y,int z)
{
          return (x+y+z)
}

int f2(int(*func)(int ),int p)
{
           return (func(10)+p);
}


Пусть y и z у меня фиксированы.
Мне надо передать в f2 функцию от x.

Код

int main()
{
        int y=10,z=4;
        int result = f2(std::bind(&f1, std::placeholders::_1, y, z), p);
}


Все правильно?
Что такое "_1" ?

Это сообщение отредактировал(а) Mormishka - 22.4.2011, 19:33
PM MAIL   Вверх
bsa
Дата 22.4.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mormishka, это все доступно только в будущем стандарте С++. Если у тебя f2 определена так, как ты указал, то работать не будет.
Я уже сказал, для твоей задачи решения нет, если не прибегать к шаблонным функциям и пр. Если ты менять f2 не собираешься (например, это что-то в сторонней библиотеке), то забудь об этом.
PM   Вверх
Mormishka
Дата 22.4.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



bsa
У меня Visual Assist. Я набираю std:: он мне предлагает  bind. У меня что будущий стандарт стоит  smile !?

А вариант с бустом boostcoder, -а ,будет работать ?

Проверил, у меня все работает. У меня будущий стандарт!   smile 

Это сообщение отредактировал(а) Mormishka - 22.4.2011, 20:08
PM MAIL   Вверх
boostcoder
Дата 22.4.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(bsa @  22.4.2011,  19:39 Найти цитируемый пост)
это все доступно только в будущем стандарте С++

что именно? std::bind() ? поясняйте. а то ощущение такое, что с++ вообще только в будущем стандарте будет работать.
и в добавок: стандарт утвердили. ждем печатного издания. обещают к осени.

Цитата(Mormishka @  22.4.2011,  19:50 Найти цитируемый пост)
А вариант с бустом boostcoder, -а ,будет работать ?

будет работать всегда и везде где работает boost ;)

Добавлено через 8 минут и 31 секунду
Цитата(Mormishka @  22.4.2011,  19:50 Найти цитируемый пост)
У меня Visual Assist. Я набираю std:: он мне предлагает  bind.

студия 2010? ;)

PM WWW   Вверх
Mormishka
Дата 22.4.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder
студия 2010


А как объявить шаблон  ?

Код

template<typename F>
void f2(F f, int p) {
   f(p);
}


Это сообщение отредактировал(а) Mormishka - 22.4.2011, 20:55
PM MAIL   Вверх
boostcoder
Дата 22.4.2011, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Mormishka @  22.4.2011,  20:54 Найти цитируемый пост)
студия 2010

откуда взялось удивление фактом присутствия std::bind() ? ;)

Цитата(Mormishka @  22.4.2011,  20:54 Найти цитируемый пост)
А как объявить шаблон  ?

обязательно дважды спрашивать/отвечать?
мой первый пост смотри ;)

PM WWW   Вверх
Mormishka
Дата 23.4.2011, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder
Подключаю
Код

#include <boost/bind.hpp>


Выдает кучу ошибок. Причем когда включаю в пустой проект работает. С чем он может конфликтовать?

Код

Ошибка    150    error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    20
Ошибка    21    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    28    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    35    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    42    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    49    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    56    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    63    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    70    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    77    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    84    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    91    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    98    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    105    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    112    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    119    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    126    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    133    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    140    error C2059: синтаксическая ошибка: )    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003
Ошибка    20    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    27    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    34    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    41    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    48    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    55    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    62    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    69    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    76    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    83    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    90    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    97    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    104    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    111    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    118    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    125    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    132    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    139    error C2059: синтаксическая ошибка: +    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003
Ошибка    144    error C2059: синтаксическая ошибка: <tag>::*    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    15
Ошибка    145    error C2065: R: необъявленный идентификатор    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    20
Ошибка    146    error C2065: T: необъявленный идентификатор    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    20
Ошибка    17    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    24    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    31    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    38    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    45    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    52    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    59    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    66    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    73    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    80    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    87    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    94    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    101    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    108    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    115    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    122    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    129    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    136    error C2143: синтаксическая ошибка: отсутствие ")" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003
Ошибка    18    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    25    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    32    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    39    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    46    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    53    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    60    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    67    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    74    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    81    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    88    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    95    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    102    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    109    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    116    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    123    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    130    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    137    error C2143: синтаксическая ошибка: отсутствие ";" перед "*"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003
Ошибка    22    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    29    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    36    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    43    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    50    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    57    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    64    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    71    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    78    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    85    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    92    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    99    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    106    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    113    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    120    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    127    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    134    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    141    error C2238: непредвиденные лексемы перед ";"    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003
Ошибка    149    error C2645: нет полного имени для указателя на член (имеется ":: *")    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    20
Ошибка    148    error C2653: T: не является именем класса или пространства имен    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    20
Ошибка    143    error C2988: неопознанное объявление или определение шаблона    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_cc.hpp    15
Ошибка    19    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    30
Ошибка    26    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    95
Ошибка    33    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    146
Ошибка    40    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    212
Ошибка    47    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    261
Ошибка    54    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    325
Ошибка    61    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    374
Ошибка    68    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    438
Ошибка    75    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    487
Ошибка    82    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    551
Ошибка    89    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    600
Ошибка    96    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    664
Ошибка    103    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    713
Ошибка    110    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    777
Ошибка    117    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    826
Ошибка    124    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    890
Ошибка    131    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    939
Ошибка    138    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\program files\boost\boost_1_46_1\boost\bind\mem_fn_template.hpp    1003


Это сообщение отредактировал(а) Mormishka - 23.4.2011, 06:45
PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Mormishka, а ты создаешь с++ проект? или Си? или в студии невозможно создать Си проект.
создай с++ проект, и вставь в него код из моего первого поста.
PM WWW   Вверх
Mormishka
Дата 23.4.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder
Твой пример работает. У меня просто программа сложнее, там много параметров, еще указатель на функцию передается. 

Код

#include <boost/bind.hpp>
#include <functional>


template<typename F>
static double solve_one_equat(F function,double x0)
{
    const double dx=1e-5,epsilon=1e-15;;
    if (fabs(function(x0))<epsilon)
    {
        return x0;
    } 
    else
    {
        double x=x0,delta_x;
        do 
        {
            delta_x=-function(x)*dx/(function(x+dx)-function(x));
            x+=delta_x;
        } while (fabs(delta_x)>epsilon);
        return x;
    }
}

double F_line(double mr,double mur,double L,double ka, double kr,double s,double dt,double ror)
{
    return -mr*mur*L/(ka*kr*s*dt*ror);
}

double F_potok(
    std::function<double(double,double,double,double,double,double,double,double)> function,
    double p2,double p1,
    double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,
    double ka2, double kr2,double ror2) 
{
    return (function(mr,mur,L,ka1,kr1,s,dt,ror1)+function(mr,mur,L,ka2,kr2,s,dt,ror2)-p2+p1);
}

double GetLineFlow(double p2,double p1,double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,double ka2, double kr2,double ror2)
{
    return solve_one_equat(boost::bind(&F_potok,&F_line,p2,p1,
        std::placeholders::_1,
        mur, L, s, dt, ka1,  kr1, ror1, ka2,  kr2, ror2),0);
}


Это сообщение отредактировал(а) Mormishka - 23.4.2011, 14:06
PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



"std::placeholders::" - убери везде.

Добавлено через 2 минуты и 22 секунды
"std::function" - замени на "boost::function", и подключи "<boost/function.hpp>"

Добавлено через 2 минуты и 58 секунд
"#include <functional>" - это удали.
PM WWW   Вверх
Mormishka
Дата 23.4.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Также куча ошибок.
Код

#include <boost/bind.hpp>
#include <boost/function.hpp>

template<typename F>
static double solve_one_equat(F function,double x0)
{
    const double dx=1e-5,epsilon=1e-15;;
    if (fabs(function(x0))<epsilon)
    {
        return x0;
    } 
    else
    {
        double x=x0,delta_x;
        do 
        {
            delta_x=-function(x)*dx/(function(x+dx)-function(x));
            x+=delta_x;
        } while (fabs(delta_x)>epsilon);
        return x;
    }
}

double F_line(double mr,double mur,double L,double ka, double kr,double s,double dt,double ror)
{
    return -mr*mur*L/(ka*kr*s*dt*ror);
}

double F_potok(
    boost::function<double(double,double,double,double,double,double,double,double)> function,
    double p2,double p1,
    double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,
    double ka2, double kr2,double ror2) 
{
    return (function(mr,mur,L,ka1,kr1,s,dt,ror1)+function(mr,mur,L,ka2,kr2,s,dt,ror2)-p2+p1);
}

double GetLineFlow(double p2,double p1,double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,double ka2, double kr2,double ror2)
{
    return solve_one_equat(boost::bind(&F_potok,&F_line,p2,p1,
        _1,
        mur, L, s, dt, ka1,  kr1, ror1, ka2,  kr2, ror2),0);
}

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


pattern`щик
****


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

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



очень жестокие у тебя функции smile
разбей их на более мелкие. а то черт ногу сломит в таком кол-ве аргументов.

Добавлено через 5 минут и 31 секунду
еще бы понять что ты хочешь получить...

Добавлено через 8 минут и 42 секунды
Цитата(Mormishka @  23.4.2011,  14:11 Найти цитируемый пост)

solve_one_equat(boost::bind(&F_potok,&F_line,p2,p1,
        _1,
        mur, L, s, dt, ka1,  kr1, ror1, ka2,  kr2, ror2),0);

тут ты создаешь функциональный объект и передаешь его в solve_one_equat().
но что означает это?: &F_potok,&F_line

объясни как твой код должен работать?
PM WWW   Вверх
Mormishka
Дата 23.4.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Функция должна принимать указатель на функцию и одну переменную
Код

template<typename F>
static double solve_one_equat(F function,double x0);


Простая функция
Код

double F_line(double mr,double mur,double L,double ka, double kr,double s,double dt,double ror);


Функция которая должна принимать указатель на функцию F_line и несколько своих аргументов
Код
 
double F_potok(
    boost::function<double(double,double,double,double,double,double,double,double)> function,
    double p2,double p1,
    double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,
    double ka2, double kr2,double ror2);


Главная функция.
Она вызывает функцию solve_one_equat, в качетсве аргумета которой мы должны передать указатель на функцию F_line зависящую только от одной переменной mr, все остальные переменные фиксированы.

Код

double GetLineFlow(double p2,double p1,double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,double ka2, double kr2,double ror2)
{
    return solve_one_equat(boost::bind(&F_potok,&F_line,p2,p1,
        _1,
        mur, L, s, dt, ka1,  kr1, ror1, ka2,  kr2, ror2),0);
}




Это сообщение отредактировал(а) Mormishka - 23.4.2011, 14:42
PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



если я тебя правильно понял, то в байнде, у тебя должен создаваться еще один функциональный объект на месте "&F_line". а его не.


Это сообщение отредактировал(а) boostcoder - 23.4.2011, 14:45
PM WWW   Вверх
Mormishka
Дата 23.4.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Наверное да, &F_line это аргумент функции F_potok.

В общем нужно получить функцию Из функции
 
Код

double F_potok(
    boost::function<double(double,double,double,double,double,double,double,double)> function,
    double p2,double p1,
    double mr,double mur,double L,double s,double dt,
    double ka1, double kr1,    double ror1,
    double ka2, double kr2,double ror2);


Код

double f_result(double mr); где все остальные переменные фиксированы.

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


pattern`щик
****


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

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



Цитата(Mormishka @  23.4.2011,  14:51 Найти цитируемый пост)
нужно получить функцию Из функции

с чем проблема?
байнд ты использовать научился, вроде как.

Добавлено через 1 минуту и 22 секунды
тут есть перевод использования байнда, проиллюстрированный в картинках  smile 
PM WWW   Вверх
Mormishka
Дата 23.4.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder
Я так понял проблема в том что с указателями функций он не работает.
PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Mormishka @  23.4.2011,  18:55 Найти цитируемый пост)
проблема в том что с указателями функций он не работает

ошибаешься.
ты неправильно создаешь функциональный объект.
твой функциональный объект, аргументом должен брать другой функциональный объект. я об этом уже писал. и ты вроде как на тот момент понял.
PM WWW   Вверх
Mormishka
Дата 24.4.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



boostcoder
А как сделать на функцию-член с учетом boost::function ? 
PM MAIL   Вверх
mes
Дата 24.4.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

bind(&That::member, that, _1 );




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


Бывалый
*


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

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



Почему тогда не этот код не работает?

Код

double Sample_1::f1(double(Sample_1::*fun)(double),double x)
{
    return (this->*fun)(x);
}


double Sample_1::f3(double x)
{
    return x;
}

double Sample_1::f4(double x)
{
    return f1(boost::bind(&Sample_1::f1,&Sample_1::f3,_1),x);
}



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


pattern`щик
****


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

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



Цитата(Mormishka @  24.4.2011,  13:04 Найти цитируемый пост)
boost::bind(&Sample_1::f1,&Sample_1::f3,_1)

ты принципиально не хочешь читать доку?
PM WWW   Вверх
bsa
Дата 24.4.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(boostcoder @  24.4.2011,  13:12 Найти цитируемый пост)
ты принципиально не хочешь читать доку? 

А если бы со мной ты согласился, что решения нет, то больше вопросов бы не было smile 
Рано ему еще bind. РАНО!
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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