2015-05-24 3 views
-2

В настоящее время я пытаюсь решить задачу, которая для меня довольно трудна, новичок в C, и я пришел к этому моменту, когда я не знаю, что делать дальше.C-программа: ошибка сегментации

Моя задача - реализовать многочлены с несколькими функциями .... Функции должны быть понятны, когда вы смотрите на код, который я думаю.

Моя точная проблема заключается в том, что я не получаю ошибку компилятора, но с ошибкой сегментации. Я отметил, где мои попытки отладки привели меня к. Но я совершенно не понимаю, что мне нужно изменить. Надеюсь, кто-то может помочь мне исправить мой код.

Так вот три части: код Номер один: poly.c

#include <stdlib.h> 
#include <stdio.h> 
#include <assert.h> 
#include "poly.h" 

struct poly_t { 
    unsigned degree; 
    int *coeffs; 
    }; 


    //constructor: heap 
    poly_t *poly_alloc(unsigned degree){ 

    poly_t *heap_p; 
    heap_p = malloc(sizeof(*heap_p)+(degree+1)*sizeof(int)); //or malloc(sizeof(*heap_p)*(degree+1)) furthermore not sure if degree or degree +1 

    } 

//free heap 
    void poly_free(poly_t *p){ 
    int *coeffs = p->coeffs; 
    free(coeffs); 
    free(p); 
    } 


    void poly_set_coeff(poly_t *p, unsigned deg, int coeff){ 
    p->degree = deg; 
    p->coeffs += deg; 
    p->coeffs[deg] = coeff; 

    //does not work Segmentation Fault not sure what to do 
    //p->coeffs += deg; 
    //*p->coeffs = coeff; 
     printf("%d",*p->coeffs); 
    } 

//different variations 
    poly_t *poly_linear(poly_t *p, int a1, int a0){ 
    p->degree=1; 
    *p->coeffs=a1; 
    p->coeffs++; 
    *p->coeffs=a0; 
    p->coeffs--; 
    } 


    poly_t *poly_quadratic(poly_t *p, int a2, int a1, int a0){ 
    p->degree=2; 
    *p->coeffs=a2; 
    p->coeffs++; 
    *p->coeffs=a1; 
    p->coeffs++; 
    *p->coeffs=a0; 
    p->coeffs-=2; 
    } 

//evaluate using horner 
    int poly_eval(poly_t const *p, int x){ 
    int d = p->degree; 
    int next; 
    int adr = *p->coeffs; 
    int *arr = p->coeffs; 
    int res = arr[d]; 
    for(int i=0; i<=d; i++){ 
     adr+=(d-i); 
     next = arr[adr]; 
     adr-=(d-i); 
     res = res*x+next; 
    } 
    return res; 
    } 


    //constructor : .txt 
    poly_t *poly_alloc_d(){ 
    //needs to be finished 
    } 

Номер два: main.c

#include <stdlib.h> 
#include <stdio.h> 
#include "poly.h" 

int main(int argc, char** argv){ 

    if(argc<3){ 
    fprintf(stderr, "syntax: %s x coeffs...", argv[0]); 
    return 1; 
    } 

    poly_t *p = poly_alloc(argc-3); 

    for(int i = 2; i<argc; i++){ 
    int coeff = atoi (argv[i]); 
    poly_set_coeff(p, i-2, coeff); 
    } 
    return 0;//for debugging 


    int x=atoi(argv[1]); 
    int y=poly_eval(p,x); 
    poly_free(p); 
    printf("%d\n", y); 

    return 0; 

} 

И наконец мой файл заголовка: poly.h

#ifndef POLY_H 
#define POLY_H 

/* unvollständiger Verbund */ 
typedef struct poly_t poly_t; 
poly_t *poly_alloc(unsigned degree); 
void poly_free(poly_t *p); 
void poly_set_coeff(poly_t *p, unsigned deg, int coeff); 
int poly_eval(poly_t const *p, int x); 

#endif /* POLY_H */ 

Я ценю каждую помощь. Надеюсь, вы поможете мне разобраться в этом, и, пожалуйста, будьте терпеливы со мной новичком до C ... Заранее спасибо

+2

Вы пробовали использовать отладчик? Они часто очень полезны для определения местоположения ошибки времени выполнения, например, ошибки сегментации. – Frxstrem

+0

Добавление к * Комментарий Frxstrem *: Прочтите здесь, может помочь: http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – alk

+1

Но чего именно вы пытаетесь достичь здесь : 'poly_t * p = poly_alloc (argc-3);'? Обычно вы передаете '3-3', по крайней мере, после использования. – alk

ответ

0

Вы не выделили и не освободили память правильно, и функция даже не вернула указатель! Я думаю, вы пытались выделить один блок памяти для структуры и массива, который он содержит, но структура не содержит массив: только указатель в массив. Вы должны выделить их отдельно:

Есть и другие ошибки тоже, например

p->coeffs += deg; 

Вы не должны играть с выделенной памятью указателем, вы уже сделали это правильно, как этот

p->coeffs[deg] = coeff; 

хотя вы можете использовать промежуточный указатель, если вы хотите:

int *ptr = p->coeffs + deg; 
*ptr = coeff; 
+0

Эй, спасибо за ответ ! То, что вы заявили, действительно помогло мне исправить мой код, я его протестировал, и он работает, пока он не освободит выделенную память, но затем я получаю еще одну ошибку: free() недопустимый размер (быстрый), который возникает, если то, что я искал Google, когда я пишу по массиву, который я создал и достигал точки за пределами. Есть ли у вас какая-либо идея, где это может быть в моем коде? EDIT: Я нашел: мне нужно изменить следующую строку: heap_p-> coeffs = malloc ((degree + 1) * sizeof (int)), потому что, если у меня есть степень 3, мне нужно пространство для 4 коэффициентов a1 * x^3 + a2 * x^2 + a3 * x^1 + a4 * x^0 – WoodPecker

Смежные вопросы