Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
45 / 45 / 40
Регистрация: 31.08.2015
Сообщений: 147
1

Ошибка сегментации

02.11.2016, 23:37. Просмотров 396. Ответов 4
Метки нет (Все метки)

Написал программу, которая по схеме Горнера преобразует многочлен до квадратного уравнения. По факту программа сама работает, выводит всё что нужно, но после или перед выходом из цикла она вылетает.
Вот полный код:
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
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
void founddells(double a, double *c,double m) //Поиск и запись всех делителей 0 коэффициента
{
    double i;
    a = fabs(a);
    int k = (int)a;
    int z;
    for(i = 1; i <= a*2 ;i++) {
        z = (int)i;
        if(!(k % z)) {*c = i/m;c++;*c = -i/m; c++;}
    }
}
void clean(double *c, double n) //Очистка массива для последующей записи
{
    int i;
    for(i = 0; i < n; i++) c[i] = 0;
}
double pow(double a, int n) //Возведение в степень
{
    if(n > 0)return a*pow(a, n-1);
    else return 1;
}
int main()
{
    int i;
    printf("Write vishuy stepen'\n");
    int p;
    scanf("%d", &p);
    double *n = (double*)malloc(sizeof(double) * p+4);
    printf("Write koeffs:\n");
    for(i = 0; i <p ; i++) { //Сканируем коеффициенты
        scanf("%lf", &n[i]);
    }
    for(i = 0; i < p; i++) { //Выводим исходное уравнение
        printf("x^%d*%.1f %c", p-i-1,fabs(n[i]), (n[i+1] > 0) ? (i == p-1) ? 0 : '+' :(i == p-1) ? 0 : '-');
    }
    double j = n[p-1]; //Коеффициент при 0 степени
    putchar('\n');
    double *r = (double *) malloc(100*4); //Память под коэффициенты
    double viraj = 0; // Храним здесь значение уравнения
    int m = 0; //Счетчик
    double std = 0; //В схеме горнера
    double count = 0; //Нужный делитель
    for(;p > 3;p--) { //Поехали, пока не дойдем до квадратного уравнения
        clean(r,100);//Полностью чистим массив
        founddells(j,r,n[0]); //Ищем делители коэффициента при 0
        for(i = 0; *r != 0 ; i++,r++) { //Перебираем все делители
            for(m = 0; m < p; m++)
                viraj =viraj + pow(*r, p-m-1) * n[m]; //Считаем значение при таком то делителе
            if(viraj == 0) {count = *r;break;} //Если равно 0 то подходит
            viraj = 0;//Обнуляем для последующих вычислений
        }
        std = n[0]; //Снимаем первый коэффициент при самой старшей степени
        n[p-1] = 0; //Сразу же скидываем остаток на 0 , так как мы просто упращаем уравнение
        for(i = 1; i < p-1; i++) {
            n[i] = count * std + n[i]; //Записываем последующие коэффициенты по правилу : предыдущий * выбраный делитель + нынешний
            std = n[i]; //Записываем нынешний делитель что бы в следующий раз его применить
        }
        for(i = 0; i < p-1; i++) { //Опять выводим уравнение
            printf("x^%d*%.1f %c", p-i-2, fabs(n[i]), (n[i+1] > 0) ? (i == p-2) ? 0 : '+' :(i == p-2) ? 0 : '-');
        }
        putchar('\n');
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2016, 23:37
Ответы с готовыми решениями:

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

Ошибка сегментации
# include &lt;sys/types.h&gt; # include &lt;sys/times.h&gt; # include &lt;sys/socket.h&gt; # include &lt;stdio.h&gt; #...

Ошибка сегментации
Задача: В двух файлах дано 2 массива. Вывести эти 2 массива в третий файл в отсортированном виде....

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

4
С чаем беда...
Эксперт CЭксперт С++
7194 / 3532 / 959
Регистрация: 18.10.2014
Сообщений: 7,192
03.11.2016, 01:12 2
Цитата Сообщение от IVAN1234 Посмотреть сообщение
C
1
double *n = (double*)malloc(sizeof(double) * p+4);
Что здесь делает некое +4? К чему этот тут?

Цитата Сообщение от IVAN1234 Посмотреть сообщение
C
1
2
for(i = 0; i < p; i++) { //Выводим исходное уравнение
  printf("x^%d*%.1f %c", p-i-1,fabs(n[i]), (n[i+1] > 0) ? (i == p-1) ? 0 : '+' :(i == p-1) ? 0 : '-');
Так а это что такое? Почему делается доступ к n[i+1] (то есть n[p]), когда память была выделена только для элементов от n[0] до n[p - 1] (ну плюс еще некое загадочное +4)?

Цитата Сообщение от IVAN1234 Посмотреть сообщение
C
1
double *r = (double *) malloc(100*4); //Память под коэффициенты
Опять фигурирует какое-то 4...
1
45 / 45 / 40
Регистрация: 31.08.2015
Сообщений: 147
03.11.2016, 02:13  [ТС] 3
TheCalligrapher, дело в том что изначально программа обрабатывал коэффициенты только целого типа, отсюда вообщем то и 4.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а это что такое? Почему делается доступ к n[i+1] (то есть n[p]), когда память была выделена только для элементов от n[0] до n[p - 1] (ну плюс еще некое загадочное +4)?
Здесь идет проверка коэффициента, + или - , как раз для этой цели я и добавлял 4, хотя, очевидно после переработки под double я забыл исправить, спасибо.
А проблема программы была в том, что я забыл сдвигать назад указатель r и поэтому просто не хватало памяти.
0
С чаем беда...
Эксперт CЭксперт С++
7194 / 3532 / 959
Регистрация: 18.10.2014
Сообщений: 7,192
03.11.2016, 02:27 4
Цитата Сообщение от IVAN1234 Посмотреть сообщение
А проблема программы была в том, что я забыл сдвигать назад указатель r и поэтому просто не хватало памяти.
Проблем в этой программе много разных. Даже если исправить 4 на какой-то осмысленное значение, все равно значение n[p] нигде не назначается и содержит мусор.
1
45 / 45 / 40
Регистрация: 31.08.2015
Сообщений: 147
03.11.2016, 02:34  [ТС] 5
TheCalligrapher, да, мне как вы поняли не нужно что бы там что то хранилось, да и вообще можно обойтись без неё, я же не пытаюсь что либо записать.
Ну например это можно заменить на
C
1
printf("%cx^%d*%.1f ", (n[i] > 0) ? (i == 0) ? 0:'+' : '-', p-i-1, n[i]);
Тогда это злосчастная 4 не понадобится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2016, 02:34

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

Непонятная ошибка сегментации
Собственно код #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt;...

Ошибка сегментации и указатели в СИ
Снова здравствуйте, продолжаю мучать указатели и писать ужасный код. Столкнулся с такой проблемой:...

Ошибка сегментации gcc
Здравствуйте, уважаемы форумчане) Пытаюсь реализовать шифр Плейфера. Компилируется нормально,...

Сортировка строк (ошибка сегментации)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; void string_sort(char **a, int lim,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.