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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2009, 15:33   #1
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию Program received signal SIGSEGV, Segmentation fault.

Когда запускаю дебагер:
gdb ./preci
Вюдает следуще. Я не могу понять с чем это могет быть связано.
Код:
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) run
Starting program: /users/lsg2m/perev2763/Desktop/precipitation/preci
[Thread debugging using libthread_db enabled]
[New Thread -1211492672 (LWP 5046)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1211492672 (LWP 5046)]
0x080499fc in newt::fmin (this=0xbfb6cd50, x=@0xbfb6cd88) at newt.cpp:119
119       (func->*nrfuncv)(GetN(), x, fvec);
(gdb) bt
#0  0x080499fc in newt::fmin (this=0xbfb6cd50, x=@0xbfb6cd88) at newt.cpp:119
#1  0x0804d8ed in newt::calc (this=0xbfb6cd50, x=@0xbfb6cd88, check=0xbfb6cd84)
    at newt.cpp:130
#2  0x0805b94c in main () at preci.cpp:83
Где искать ошибку. Кто-нить с этим сталкивался?
ciaonataha вне форума Ответить с цитированием
Старый 22.04.2009, 15:41   #2
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Код:
/ newt.h
#include <vector>

class interface
{
public:
	void equilibre_Fe_Cr_C(int n, std::vector <double> &Y, std::vector <double> &F)
	{ // Тут для примера заполняем вектора числами
		for (int i = 0; i < n; ++i)
		{
			Y.push_back(i);
			F.push_back(i);
		}
	}
};

class newt
{
public:
	interface *m_interface;
	void (interface::*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);                   //
public:
	void calc()
	{
		std::vector <double> loc_v;
		std::vector <double> loc_f;
		(m_interface->*nrfuncv)(10, loc_v, loc_f);
	}
};

//main.cpp
#include "newt.h"

int main()
{
	newt nt;
	interface mv;
	nt.m_interface = &mv;
	nt.nrfuncv = &interface::equilibre_Fe_Cr_C;
	nt.calc();
	getchar();
	return 0;
}
ciaonataha вне форума Ответить с цитированием
Старый 22.04.2009, 16:11   #3
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

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

Цитата:
nt.nrfuncv = &interface::equilibre_Fe_Cr_C;
разве тут нужно брать адрес? и вообще, разве так можно делать? я лично не понимаю, как компиль себя должен повести (я можно сказать, новичек). тут ведь по идее надо передавать адрес метода существующего объекта. у тебя ведь метод не статический.
тем более, зачем тебе еще указатель на функцию, если у тебя уже есть указатель на объект?
пс. возможно я не прав, но ты ответь, мне интересно разобраться)
vvviperrr вне форума Ответить с цитированием
Старый 22.04.2009, 16:23   #4
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

даже когда убираю из принципиального файла эту строчку дебагер выдает все эту же ошибку:

Код:
//nt.nrfuncv = &interface::equilibre_Fe_Cr_C;
ciaonataha вне форума Ответить с цитированием
Старый 22.04.2009, 16:24   #5
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Я вообще круглый новичек. И не понимаю что такое метод статический
ciaonataha вне форума Ответить с цитированием
Старый 22.04.2009, 16:25   #6
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

а, вроде понял.
Цитата:
(m_interface->*nrfuncv)(10, loc_v, loc_f);
какой смысл в этой записи?) вызвать метод класса, на который указывать указатель на эту же функцию? слишком сложно)
попробуй либо так
m_interface->(...);
либо так:
((interface*)this->*nrfuncv)(...);
vvviperrr вне форума Ответить с цитированием
Старый 22.04.2009, 16:29   #7
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

кстати, есьи будешь использовать ПЕРВЫЙ случай, тогда указатель на функцию тебе не нужен. если будешь использовать ВТОРОЙ случай, тебе не нужен указатель на объект.

а что новичек - приписывать надо) а то я уж испугался)
vvviperrr вне форума Ответить с цитированием
Старый 22.04.2009, 16:38   #8
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Я использую второй случай. И если, я правельно поняла про указатель на объект то это:
Код:
(m_interface->*nrfuncv)(10, loc_v, loc_f);
заменияю на:
Код:
((interface*)this->*nrfuncv)(...);
и убираю указатель на объект:
Код:
 
       nt.func = &mv;
//     nt.nrfuncv = &interface::equilibre_Fe_Cr_C;
        nt.jacobian = &pf;
//     nt.jacobfunc = &interface::Jacobian;
тогда ошибка следущая:
Код:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1211390272 (LWP 8865)]
0x080499fa in newt::fmin (this=0xbff85960, x=@0xbff85998) at newt.cpp:120
120       ((interface*)this->*nrfuncv)(GetN(), x, fvec);
ciaonataha вне форума Ответить с цитированием
Старый 22.04.2009, 16:40   #9
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

немного не так вот полный код

Код:
#include <vector>

class interface
{
public:
	void equilibre_Fe_Cr_C(int n, std::vector <double> &Y, std::vector <double> &F)
	{ // Тут для примера заполняем вектора числами
		for (int i = 0; i < n; ++i)
		{
			Y.push_back(i);
			F.push_back(i);
		}
	}
};

class newt
{
public:
	void (interface::*nrfuncv)(int nn, std::vector <double> &v, std::vector <double> &f);                   //
public:
	void calc()
	{
		std::vector <double> loc_v;
		std::vector <double> loc_f;
		((interface*)this->*nrfuncv)(10, loc_v, loc_f);
	}
};

//main.cpp

#include "newt.h"

int main()
{
	newt nt;
	nt.nrfuncv = interface::equilibre_Fe_Cr_C;
	nt.calc();
	getchar();

	return 0;
}
vvviperrr вне форума Ответить с цитированием
Старый 22.04.2009, 16:47   #10
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Код:
nt.nrfuncv = interface::equilibre_Fe_Cr_C;
Код:
error: invalid use of non-static member function 'void interface::equilibre_Fe_Cr_C(int, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)'
ciaonataha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что делает команда Run.Detach From Program? JY_ Общие вопросы Delphi 3 20.01.2009 13:58
program Project1; необходимо перенести из Pascal в Delphi Toxass Общие вопросы Delphi 22 24.11.2008 08:53
Install (Update program) MAcK Общие вопросы .NET 0 23.10.2008 11:00
Узнать Received XAOC-forever Работа с сетью в Delphi 0 30.09.2008 14:49
Copy Program с изменением атрибутов Трофимов Андрей Паскаль, Turbo Pascal, PascalABC.NET 3 04.07.2007 20:10