Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ciao
0 / 0 / 0
Регистрация: 25.12.2008
Сообщений: 28
#1

Не работает ссылка на функцию. - C++

27.04.2009, 12:32. Просмотров 872. Ответов 5
Метки нет (Все метки)

Пожалуйста,Помогите найти ошибку.Мне нужно сделать ссылку на функцию, которая является функцией класса interface. С этой ссылкой на функцию я должна работать в функциях класса newt.Проблемма в том, что у меня не получается сделать ссылку на функцию и ее челены. В итоге работаю с клоном на эту функцию и это очень не правельно.
//newt.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class newt
 
{
public:
  interface *func;
  interface *jacobian;
  sortie *print;
 
  void (interface::*nrfuncv)(int nn, std::vector <double> v, std::vector <double> f);
  void (interface::*jacobfunc)(std::vector <double> v, std::vector <double> f, std::vector < std::vector<double> > J);
 
  void (sortie::*on_subproduct)(std::vector <double> fvec);//Function of a conclusion of intermediate results
 
  newt() //Konstruktor
  {
//  on_subproduct = NULL;
  func = NULL;
  jacobian = NULL;
  print = NULL;
  }
//newt.cpp
C++
1
2
3
4
5
6
double newt::fmin(std::vector <double> x)
{
(func->*nrfuncv)(GetN(), x, fvec);//ССылка на функцию не работает. Вектор "fvec", заполяется нулями, хотя при первой ге итерации должен заполяться начальными значениями.
   for(int i=0 ; i < fvec.size() ; i++)
    {printf("%lf",fvec[i]);
}
//main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
newt nt;
matrice mat;
sortie so;
 
so.ouverture(fichiersortie); //открывает файл
 
int i=1;
        while(mat.produit[i]!=NULL)
         {
      nt.func=mat.produit[1]->frontiere[1]; 
      nt.nrfuncv= &interface::equilibre_Fe_Cr_C;//We transfer the reference to a class method interface
 
      nt.jacobian=mat.produit[1]->frontiere[1];
      nt.jacobfunc = &interface::Jacobian;//We transfer the reference to a class method interface
         i++;
         }
//        nt.on_subproduct = &sortie::ecriture; //Из-за этой строчки выдает segmentation fault
}
C++
1
2
void sortie::ecriture(std::vector <double> Y)
{....PRINTF..}
//phase.cpp
Сама функция с уравнениями, на которую идет ссылка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void interface::equilibre_Fe_Cr_C(int n, std::vector <double> Y, std::vector <double> F)
{
Y[0] = ph1->Thermo->y1[0]; //printf("%lf\n",Y[0]);
Y[1] = ph1->Thermo->y1[1]; //printf("%lf\n",Y[1]);
Y[2] = ph1->Thermo->y2[0]; //printf("%lf\n",Y[2]);
Y[3] = ph1->Thermo->y2[1]; //printf("%lf\n",Y[3]);
Y[4] = ph2->Thermo->y1[0]; //printf("%lf\n",Y[4]);
Y[5] = ph2->Thermo->y1[1]; //printf("%lf\n",Y[5]);
Y[6] = ph2->Thermo->y2[0]; //printf("%lf\n",Y[6]);
Y[7] = ph2->Thermo->y2[1]; //printf("%lf\n",Y[7]);
Y[8] = X_nf;  //printf("%lf\n",Y[8]);
//printf("%lf\n",X_C);
//printf("%lf\n",X_Cr);
 
 F[0] = ph1->Thermo->pot_chemical1[0] - ph2->Thermo->pot_chemical1[0];// printf("%lf\n",F[0]);
 F[1] = ph1->Thermo->pot_chemical1[1] - ph2->Thermo->pot_chemical1[1];// printf("%lf\n",F[1]);
 F[2] = ph1->Thermo->pot_chemical2[0] - ph2->Thermo->pot_chemical2[0];//printf("%lf\n",F[2]);
 F[3] = Y[0] + Y[1] - 1; //printf("%i\n",F[3]);
 F[4] = Y[4] + Y[5] - 1; //printf("%i\n",F[4]);
 F[5] = Y[2] + Y[3] - 1; //printf("%i\n",F[5]);
 F[6] = Y[6] + Y[7] - 1; //printf("%i\n",F[6]);
 F[7] = (ph1->Thermo->m[0] * Y[1])/(ph1->Thermo->m[0] + ph1->Thermo->m[1]) * Y[8] + (ph2->Thermo->m[0] * Y[5])/(ph2->Thermo->m[0] + ph2->Thermo->m[1]) * (1 - Y[8]) - X_Cr; //printf("%lf\n",F[7]);
 F[8] = (ph1->Thermo->m[1] * Y[2])/(ph1->Thermo->m[0] + ph1->Thermo->m[1]) * Y[8]  + (ph2->Thermo->m[1] * Y[6])/(ph2->Thermo->m[0] + ph2->Thermo->m[1]) * (1 - Y[8]) - X_C; //printf("%lf\n",F[8]);
 
for (int i = 0; i < F.size(); i++){
 printf("%lf\n",F[i]);} //Здесь вектор распечатывается нормально.
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2009, 12:32     Не работает ссылка на функцию.
Посмотрите здесь:

C++ Ссылка на функцию класса (не указатель)
Не работает ссылка на структуру C++
C++ Как работает массив указателей на функцию?
C++ Инкапсуляция, ссылка на функцию
Не работает вектор структур при передачи его в функцию-ошибки C++
Как работает ссылка с объектами, классами и перегруженным оператором [] C++
C++ Что передаётся в функцию, если в прототипе ссылка?
C++ Как работает указатель на функцию?
C++ Нужно подправить функцию, не работает
Не работает класс при передаче в функцию объекта C++
Thread ссылка на удаленную функцию о_О C++
C++ Написать функцию, которая, в зависимости от выбора пользователя вызывает соответствующую функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
27.04.2009, 12:37     Не работает ссылка на функцию. #2
На std::mem_fun_ref смотрел?
ciao
0 / 0 / 0
Регистрация: 25.12.2008
Сообщений: 28
27.04.2009, 12:42  [ТС]     Не работает ссылка на функцию. #3
А чем это Вы. Нет, не смотрела. Вообще, куда смотреть?
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
27.04.2009, 12:51     Не работает ссылка на функцию. #4
Смотреть? Разумеется, в MSDN: например, тут - http://msdn.microsoft.com/en-us/library/741a5f2d.aspx
Вообще, в любую толковую доку по стандартной библиотеке C++.
ciao
0 / 0 / 0
Регистрация: 25.12.2008
Сообщений: 28
27.04.2009, 12:58  [ТС]     Не работает ссылка на функцию. #5
Сейчас посмотрю. Спасибо. Но, я считаю, что модель в принципе рабочая и буду очень признательна, кто увидет ошибку
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
27.04.2009, 14:52     Не работает ссылка на функцию. #6
Ссылка на функцию не при чем. Вы передаете вектор в функцию по значению, вполне естественно, что никакие результаты не сохраняются. Поставьте, например,
C++
1
void interface::equilibre_Fe_Cr_C(int n, std::vector <double> &Y, std::vector <double> &F)
Yandex
Объявления
27.04.2009, 14:52     Не работает ссылка на функцию.
Ответ Создать тему
Опции темы

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru