0

我正在尝试使用 GSL 编写一个 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 个双指针而不分配任何内存……这将导致段错误。
尝试声明双变量并传递它们的地址:

#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 回答