0

ここの指示に従って、GSLを使用して3次方程式の根を見つけるCプログラムを作成しようとしています: http://www.gnu.org/software/gsl/manual/html_node/Cubic-Equations.html。これは私が思いついたものです:

#include <stdio.h>
#include <gsl/gsl_poly.h>

double *x0,*x1,*x2;
int roots;

int
main (void)
{
    roots = gsl_poly_solve_cubic(0,0,0,x0,x1,x2);

    printf( " %d ", roots);

    return 0;
}

最初に動作するかどうかをテストしたかったので、引数は 0,0,0 です。コードはコンパイルされますが、実行すると出力がなくクラッシュします。

私は何を間違っていますか?

4

3 に答える 3

2

x0、x1、および x2 はただのぶら下がりポインターです。コードを次のように変更します。

double x0,x1,x2;
int roots;

int
main (void)
{
    roots = gsl_poly_solve_cubic(0,0,0,&x0,&x1,&x2);

    printf( " %d ", roots);

    return 0;
}
于 2012-09-16T17:34:35.540 に答える
2

参照セマンティクスが C でどのように実装されているかを誤解しています。まったく同じトピックについて書いたばかりのこの回答を読んでください。

解決:

double x0, x1, x2;

int roots = gsl_poly_solve_cubic(0, 0, 0, &x0, &x1, &x2);

一言で言えば、呼び出し元は受信者変数のアドレスを取得する必要があります。受信者変数が存在する必要があります。

于 2012-09-16T17:35:24.570 に答える
1

あなたのロンクによると、私たちは持っていgsl_poly_solve_cubic (double a, double b, double c, double * x0, double * x1, double * x2)ます。メモリを割り当てずに 3 つの double ポインターを宣言すると、segfault が発生します。
double 変数を宣言して、そのアドレスを渡すだけにしてください:

#include <stdio.h>
#include <gsl/gsl_poly.h>


double x0,x1,x2;
int roots;

int
main (void)
{
    roots = gsl_poly_solve_cubic(0,0,0,&x0,&x1,&x2);

    printf( " %d ", roots);

    return 0;
}
于 2012-09-16T17:35:53.960 に答える