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

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

02.11.2016, 23:37. Просмотров 294. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2016, 23:37
Ответы с готовыми решениями:

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

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

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

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

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

4
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4848 / 2492 / 696
Регистрация: 18.10.2014
Сообщений: 4,320
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
IVAN1234
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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4848 / 2492 / 696
Регистрация: 18.10.2014
Сообщений: 4,320
03.11.2016, 02:27 4
Цитата Сообщение от IVAN1234 Посмотреть сообщение
А проблема программы была в том, что я забыл сдвигать назад указатель r и поэтому просто не хватало памяти.
Проблем в этой программе много разных. Даже если исправить 4 на какой-то осмысленное значение, все равно значение n[p] нигде не назначается и содержит мусор.
1
IVAN1234
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
03.11.2016, 02:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2016, 02:34

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

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

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


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

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

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