功能定义不允许/

时间:2014-06-30 22:40:27

标签: c

我的教授在课堂上给了我们这个代码来展示一个程序是如何工作的,然后说“回家试试看,你会发现它有效”...... 30分钟后我就无法运行了。有人可以帮助我,并指出我正确的方向。谢谢!

-I得到函数定义“double g(double x)” - 在x_left = x_mid控件到达非空函数结束的第一个

#include <stdlib.h>
#include <stdio.h>
#include <math.h>


#define FALSE 0
#define TRUE 1
#define NO_ROOT -99999.0

//function prototypes

double bisect(double, double, double, double f(double farg));

// evaluation of function

double g(double);
double h(double);

int main(void) {

double x_left, x_right, epsilon, root; //declare variables

// get endpoint and error tolerance
printf("\nEnter interval endpoints > ");
scanf("%lf%lf", &x_left, &x_right);
printf("\nEnter tolerance > ");
scanf("%lf", &epsilon);

//use bisect function to look for roots of functions
printf("\n\n For function g(x)");
root = bisect(x_left, x_right, epsilon, g);
if (root != NO_ROOT)
    printf("\n g(%.7f) = %e\n", root, g(root));

printf("\n\n For function h(x)");
root = bisect(x_left, x_right, epsilon, h);
if (root != NO_ROOT)
    printf("\n h(%.7f) = %e\n", root, h(root));

system("pause");
return (0);

}


// bisection method program coding

double bisect(double x_left, double x_right, double epsilon, double f(double farg)){

double x_mid, f_left, f_right, f_mid;
int root_found;

// computes function at initial end points
f_left = f(x_left);
f_right = f(x_right);

// if no change in sign

if (f_left * f_right > 0)   {
    printf("\nmay not be no root in [%.7f, %.7f]\n\n", x_left, x_right);
return NO_ROOT;
}

// searches as long as interval size is large enough

root_found = FALSE;

while (fabs(x_right - x_left) > epsilon && !root_found) {

    // compute the mid point
    x_mid = (x_left + x_right) / 2.0;
    f_mid = f(x_mid);

    if (f_mid == 0.0) {
        root_found = TRUE;}
    else if (f_left * f_mid < 0.0) {
        x_right = x_mid;
    } else {
        x_left = x_mid;
    }


// trace loop execution
if (root_found)
    printf("\nRoot found at x = %.7f , midpoint of [%.7f, %.7f] ", x_mid, x_leftx_right);
else
    printf("\nNew interval is [%.7f, %.7f] \n\n", x_left, x_right);


//if there is a root
return ((x_left + x_right)/2.0);
}

// functions for which roots are sought

double g(double x){
return (5 * pow(x, 3.0) - 2 * pow(x, 2.0) +3);
}

double h(double x){
return (pow(x, 4.0) - 3 * pow(x,2.0) - 8);
};
}

1 个答案:

答案 0 :(得分:1)

我在这一行收到错误:

 printf("\nRoot found at x = %.7f , midpoint of [%.7f, %.7f] ", x_mid, x_leftx_right

x_leftx_right未声明。

如果我将其更改为x_left, x_right,则除了“对g的未定义引用”和“对h的未定义引用”之外,它编译正常。

未定义引用g的原因是您从未为由g原型化的函数double g(double);提供函数定义。您确实在g中提供了嵌套函数bisect。嵌套函数是非标准扩展,bisect::g是与g不同的函数。同样适用于h

要解决此问题,请将gh的定义移至bisect函数结尾之后;而不是在那个功能里面。

“控制到达非void函数结束”警告的原因可能是因为return循环后没有while语句。

您的行return ((x_left + x_right)/2.0);行位于由while (fabs(x_right - x_left) > epsilon && !root_found) {开始的循环内。如果循环条件完成此循环不再为真,那么执行将在函数结束时返回,而不返回任何内容。

NB。如果您正确缩进代码以便排列{,那么您不太可能遇到此类问题。您的编辑器应该有一个密钥,您可以使用它来查找匹配的大括号。此外,在严格标准模式下运行编译器会产生有关嵌套函数使用的错误。

`