KamidzuKou
1

GSL и Windows XP: ошибка сегментации

11.05.2013, 16:04. Показов 1100. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Я пишу дипломную работу, в которой требуется создание приложения, причем желательно с использованием библиотеки GSL для вычисления корня уравнения разными методами, описанными в этой библиотеке.
Я попытался проверить, работает ли вообще данная библиотека под Windows XP Professional. В качестве редактора использовалась IDE Bloodshed Dev-C++ 4.9.9.2, версия библиотеки GSL 1.6, скачал с помощью DevPak.
При создании тестовой программы по рекомендациям, приведенным в файле gsl-ref.pdf, столкнулся с тем, что программа компилируется, но при запуске из консоли EXE-файла происходит вылет этой программы.
Привожу исходный код ключевых файлов(взято отсюда: http://www.gnu.org/software/gs... 02dFinding, для удобства чтения весь код убрал под кат):
demo_fn.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
struct quadratic_params
       {
         double a, b, c;
       };
     
     double quadratic (double x, void *params);
     double quadratic_deriv (double x, void *params);
     void quadratic_fdf (double x, void *params, 
                         double *y, double *dy);

demo_fn.c
Кликните здесь для просмотра всего текста
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
28
29
30
31
32
33
34
35
36
37
38
39
40
double
     quadratic (double x, void *params)
     {
       struct quadratic_params *p 
         = (struct quadratic_params *) params;
     
       double a = p->a;
       double b = p->b;
       double c = p->c;
     
       return (a * x + b) * x + c;
     }
     
     double
     quadratic_deriv (double x, void *params)
     {
       struct quadratic_params *p 
         = (struct quadratic_params *) params;
     
       double a = p->a;
       double b = p->b;
       double c = p->c;
     
       return 2.0 * a * x + b;
     }
     
     void
     quadratic_fdf (double x, void *params, 
                    double *y, double *dy)
     {
       struct quadratic_params *p 
         = (struct quadratic_params *) params;
     
       double a = p->a;
       double b = p->b;
       double c = p->c;
     
       *y = (a * x + b) * x + c;
       *dy = 2.0 * a * x + b;
     }

Ну, и сама функция gsl-test.c(брал в качестве эксперимента метод Брента)
Кликните здесь для просмотра всего текста
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
     #include <gsl/gsl_errno.h>
     #include <gsl/gsl_math.h>
     #include <gsl/gsl_roots.h>
     
     #include "demo_fn.h"
     #include "demo_fn.c"
     
     int
     main (void)
     {
       int status;
       int iter = 0, max_iter = 100;
       const gsl_root_fsolver_type *T;
       gsl_root_fsolver *s;
       double r = 0, r_expected = sqrt (5.0);
       double x_lo = 0.0, x_hi = 5.0;
       gsl_function F;
       struct quadratic_params params = {1.0, 0.0, -5.0};
     
       F.function = &quadratic;
       F.params = &params;
     
       T = gsl_root_fsolver_brent;
       s = gsl_root_fsolver_alloc (T);
       gsl_root_fsolver_set (s, &F, x_lo, x_hi);
     
       printf ("using %s method\n", 
               gsl_root_fsolver_name (s));
     
       printf ("%5s [%9s, %9s] %9s %10s %9s\n",
               "iter", "lower", "upper", "root", 
               "err", "err(est)");
     
       do
         {
           iter++;
           status = gsl_root_fsolver_iterate (s);
           r = gsl_root_fsolver_root (s);
           x_lo = gsl_root_fsolver_x_lower (s);
           x_hi = gsl_root_fsolver_x_upper (s);
           status = gsl_root_test_interval (x_lo, x_hi,
                                            0, 0.001);
     
           if (status == GSL_SUCCESS)
             printf ("Converged:\n");
     
           printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
                   iter, x_lo, x_hi,
                   r, r - r_expected, 
                   x_hi - x_lo);
         }
       while (status == GSL_CONTINUE && iter < max_iter);
     
       gsl_root_fsolver_free (s);
     
       return status;
     }

В параметрах компилятора выставлено следующее:
Кликните здесь для просмотра всего текста
Добавить следующие команды в запуск компилятора:
-W -Wall
Добавить эти команды к командной строке компоновщика:
-lgsl -lgslcblas

Последнюю опцию пришлось включить во избежание возникновения ошибок вида [Linker error].
После компиляции при запуске программы выдает стандартное сообщение при ошибках в Windows XP:
gsl-test.exe - обнаружена ошибка. Приложение будет закрыто.
При отладке выясняется, что программа вызывает нарушение доступа(ошибку сегментации), причем во вкладке "Отслеживать" высвечивается следующая информация:
Кликните здесь для просмотра всего текста
Функция Аргументы Файл Строка
gsl_root_fsolver_alloc () 20
main () F:\gsl-test.exe 21

Если я правильно понимаю, что происходит, ошибка сегментации происходит именно при вызове gsl_root_fsolver_alloc.
Большая просьба помочь советом, подсказать,правильно ли я понимаю ситуацию и как с этой проблемой сегментации бороться. Еще раз подчеркиваю, это тестовый файл, построенный на данных изруководства GNU Scientific Library с целью понять, смогу ли я написать затем решение с помощью инструментария GSL непосредственно для своей дипломной работы или проще написать вручную нужные мне функции без использования этой библиотеки.
Заранее спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2013, 16:04
Ответы с готовыми решениями:

Ошибка сегментации
собственно прикрепляю проект (code::blocks). при запуске вылетает ошибка. почему - хз.

Ошибка сегментации
всем здраствуйте. double power(double n, int p) //определение функции 22 { 23 if (n...

ошибка сегментации
Всем привет! Я никогда не программировал, а тут решил склепать небольшую программку. Да вот...

ошибка сегментации
где может быть ошибка?

1
KamidzuKou
12.05.2013, 19:06 2
Проблема остается актуальной, для формулы, которую я использую в дипломе, реализация без GSL не работает, зависает на стадии вычисления.
12.05.2013, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2013, 19:06
Помогаю со студенческими работами здесь

Ошибка сегментации
Здравствуйте, написал программу, запускаю- Windows пишет: &quot;обнаружена ошибка. Приложение будет...

Ошибка сегментации
int main() { int mas; } Объясните, почему такой код привод к ошибке? (компилятор VS 2012)

Ошибка сегментации
Написал программу, которая по схеме Горнера преобразует многочлен до квадратного уравнения. По...

Ошибка сегментации
Здравствуйте. Скажите, почему так делать нельзя? class A { public: A* array; //массив ...

Ошибка сегментации
Здравствуйте! Есть несколько программ. #1 вытаскивает 2 числа из очереди сообщений, перемножает,...

Ошибка сегментации
Здравствуйте! Написал классы матрица и вектор с длинными комплексными числами. Длинное комплексное...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru