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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сделать функцию 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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