C:返回正确的值,但分配错误的值:-1。#IND000000000000

时间:2015-09-24 05:02:15

标签: c algorithm

使用双变量类型时遇到问题。在子函数中,返回值为mid = 1.0306534300317196。但是将此值分配给coord[0]时。但是coord[0]=-1.#IND000000000000。 我真的不明白为什么这是错的。 请帮我清除它。谢谢!

     #include <stdio.h>
double x[11];
double m[11];

double coord[9];

double abs(double a, double b){
    if(a>b)
        return a-b;
    else return b-a;
}
double findCoord(double left, double right) {
    double mid = (left + right)/2;
    //double oldmid =0;
    double f_left = 0;
    double f_right = 0; 

    f_left= f_left + m[0]/((mid-x[0]) * (mid-x[0]));

    f_right= f_right + m[1]/((x[1]-mid) * (x[1]-mid));

    // check errors of value ?????
    if(abs(f_right,f_left)<0.000000001)
        return mid;
    // check by F
    if (f_left==f_right)
        return mid;
    if (f_left > f_right){
        left=mid;   
        findCoord(left, right);
    }
    if (f_left < f_right){
        right=mid;  
        findCoord(left, right);
    }           
}   
int main(void)
{
    x[0]=1;
    x[1]=2;
    m[0]=1;
    m[1]=1000;

    coord[0]=findCoord(x[0], x[1]);


    printf("%.10f \n", coord[0]);

    while(1);
    return 0;//Your program should return 0 on normal termination.
}

4 个答案:

答案 0 :(得分:1)

您的代码应该使用

return findcoord(left,right);

而不是

findcoord(left,right);
函数findcoord中的

用于递归调用,否则函数返回的递归调用的值会丢失!

答案 1 :(得分:1)

对于findCoord func中的最后两个条件,你不返回任何东西,只给出调用函数。返回语句只是将中间值返回到其先前的调用函数。在递归系统中,函数调用自身很多次。根据你的代码,它只返回前一步的中间值,但不是所有以前的调用。所以,使用

$('body').on('click'

答案 2 :(得分:0)

findCoord()会返回abs(f_right,f_left)<0.000000001f_left==f_right的值。如果这两个都不成立,则不返回任何值。

确保findCoord()中的所有代码路径都返回一个值。

答案 3 :(得分:0)

尝试使用-Wall选项编译代码。它会给你一些重要的警告

test.c:23:8: warning: conflicting types for built-in function ‘abs’
 double abs(double a, double b){
        ^
test.c: In function ‘findCoord’:
test.c:52:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

这些警告意味着:

  1. 您不能将buildin函数名称abs用于您的函数
  2. 如果声明为非空,则您的函数需要始终返回一个值。
  3. 解决方案可能是

    double myabs(double a, double b){
        if(a>b)
            return a-b;
        else return b-a;
    }
    double findCoord(double left, double right) {
        double mid = (left + right)/2;
        //double oldmid =0;
        double f_left = 0;
        double f_right = 0;
    
        f_left= f_left + m[0]/((mid-x[0]) * (mid-x[0]));
    
        f_right= f_right + m[1]/((x[1]-mid) * (x[1]-mid));
    
        // check errors of value ?????
        if(myabs(f_right,f_left)<0.000000001)
            return mid;
        // check by F
        if (f_left==f_right)
            return mid;
        if (f_left > f_right){
            left=mid;
            return findCoord(left, right);
        }
        if (f_left < f_right){
            right=mid;
            return findCoord(left, right);
        }
    
        return 0; // Gcc happy :)
    }