标题:函数嵌套定义的问题
只看楼主
好好的A
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-29
结帖率:0
已结贴  问题点数:20 回复次数:10 
函数嵌套定义的问题
--------------------Configuration: test - Win32 Debug--------------------
Compiling...
calculation.cpp
calculation.cpp(7) : error C2084: function 'double __cdecl newtow_iteration(double,double,double (__cdecl *)(double),double (__cdecl *)(double))' already has a body
calculation.cpp(43) : error C2084: function 'double __cdecl simple_itertion(double,double,double (__cdecl *)(double))' already has a body
执行 cl.exe 时出错.

test.exe - 1 error(s), 0 warning(s)
这种错误一般怎么解决
搜索更多相关主题的帖子: function already warning double 
2015-12-29 15:20
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
那源代码属于几级保密的呢  

DO IT YOURSELF !
2015-12-29 15:21
好好的A
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-29
得分:0 
回复 2楼 wp231957
怎么进行修改呢


[此贴子已经被作者于2015-12-29 15:37编辑过]

2015-12-29 15:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
那信息告訴你,函數已有定義體,即你犯了重覆定義錯誤。

授人以渔,不授人以鱼。
2015-12-29 15:28
好好的A
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-29
得分:0 
回复 4楼 TonyDeng
知道啊!但是不知如何修改
2015-12-29 15:45
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
得分:5 
是否可以把代码贴出来,只看编译器给出的错误无法改呀
2015-12-29 15:50
好好的A
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-29
得分:0 
头文件calculation.h
double newtow_iteration(double x,double eps,double (*f)(double),double (*df)(double)); //牛顿迭代法
double simple_itertion(double x,double eps,double (*f)(double));                 //简单迭代法
double BXdoublenode_itertion(double a,double b,double eps,double (*f)(double)); //变形双点弦截法,a,b为左右区间;

calculation.cpp文件   
# include<stdio.h>
# include<calculation.h>
# include<math.h>

double newtow_iteration(double x,double eps,double (*f)(double),double (*df)(double)) //牛顿迭代法
{
    long max=1000;              //迭代初值x,精度eps ,f原函数,df导函数
    int k=0;       //k值记录迭代次数
    double x1,x2,fx1,dfx1,d=1.0;
    x2=x; //使x2获得迭代初值
    while((d>eps)&&(k<max))
    {
        
        x1=x2;
        fx1=(*f)(x1);
        dfx1=(*df)(x1);
        if(dfx1<1e-10)
        {
            printf("F(X)的导数为0:\n");
            return 0;
        }
        else
        {
          x2=x1-fx1/dfx1;
          d=fabs(x2-x1);
          k++;
        }
        


    }
    if(k>max)
    {
        printf("迭代次数超过最大迭代次数,可能不收敛:\n");
        return 0;
    }
    else
        return x1;

}
double simple_itertion(double x,double eps,double (*f)(double)) //简单迭代法
{
    long max=1000;              //迭代初值x,精度eps ,f原函数
    int k=0;                     //k值记录迭代次数
    double x1,x2,d=1.0;
    x2=x;                       //使x2获得迭代初值
    while((d>eps)&&(k<max))
    {
        
        x1=x2;
        x2=f(x1);
        d=fabs(x2-x1);
        k++;
        
    }
    if(k>max)
    {
        printf("迭代次数超过最大迭代次数,可能不收敛:\n");
        return 0;
    }
    else
        return x1;

}
double BXdoublenode_itertion(double a,double b,double eps,double (*f)(double)) //变形双点弦截法,a,b为左右区间
{
    long i,maxi=2;              //迭代初值x,精度eps ,f原函数
    double epsilon,x0,x1,x,fx0,fx1;
    x0=a;                         //使得a,b获得迭代初值
    x1=b;
    fx0=f(x0);
    fx1=f(x1);
    for(i=0;i<maxi;i++)
    {
        x=x1-fx1*(x1-x0)/(fx1-fx0);
        x0=x1;
        fx0=fx1;
        x1=x;
        fx1=f(x1);
        if(fx1==0)
            break;
        if(fabs(x1-x0)<=epsilon)
            break;
    }
    if(i>maxi)
    {
        printf("迭代次数超过最大迭代次数,可能不收敛:\n");
        return 0;
    }
    else
        return x1;
   
}


test 文件
# include<stdio.h>
# include"calculation.h"

# include<windows.h>
int main()
{
    double eps=1e-3;
    double x,a,b;
    char t;
    double fun(double),dfun(double),fun1(double),fun2(double);
    printf("请输入A,B,C选择计算方法:\nA:牛顿迭代法,B:简单迭代法,C:变形双点弦截法:\n");
    scanf("%c",t);                        //用菜单实现对不同计算方法的选择
    switch(t)
    {
    case 'A':
        printf("请输入迭代初值a:\n");
        scanf("%lf",&a);
        x=a;
        x=newtow_iteration(a,eps,fun,dfun);// 调用牛顿迭代法函数
        printf("方程f(x)=0的根是:\n%f\n",x);
        break;
    case 'B':
        printf("请输入迭代初值a:\n");
        scanf("%lf",&a);
        x=a;
        x=simple_itertion(a,eps,fun1);       //调用简单迭代法函数
        printf("方程f(x)=0的根是:\n%f\n",x);
        break;
    /*case 'C':
        printf("请数入迭代初值a,b:");
        scanf("%lf,%lf",&a,&b);
        x=BXdoublenode_itertion(a,b,eps,fun2);
        printf("方程f(x)=0的根是:\n%f\n",x);
        break;*/
    default:printf("输入的数据错误!");

    }
    system("pause"); /*在关闭此软件,直接点击DEBUG 运行时,
                     数入数据以后会出现闪退的情况,百度了一下才知道加上这一句可以解决这个问题*/

    return 0;

}
double fun(double x)
{
   
    return x*x*x*x*x+5*x-41;//牛顿迭代法的原函数f(x)
   
}
double dfun(double x)
{
   
    return 5*x*x*x*x+5; //牛顿迭代法的导函数df(x)

}
double fun1(double x)   //简单迭代法的原函数
{
    return 1/(x*x*x*x)+3;
}
double fun2(double x)
{
    return 2*x*x*x*x*x-3*x*x-7;//变形双点弦截法的原函数
}
2015-12-29 15:58
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:5 
大约看了一下  应该差在函数指针那部分了

你的这 double fun(double),dfun(double),fun1(double),fun2(double);几个函数的实现部分都是在测试函数中实现的

那么他的调用者如何能知道他是如何实现的呢

DO IT YOURSELF !
2015-12-29 16:06
好好的A
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-12-29
得分:0 
回复 8楼 wp231957
那该如何进行改正呢?
2015-12-29 16:11
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
我觉得你的函数设计是有问题的  就这么几个小函数  没必要弄 >1的文件个数(我指.c .h .cpp一类的)

二、函数的参数没必要设计成带有函数指针的参数格式  自己把自己弄复杂化了

还有一点  一个一个课题的弄  不要贪多 一次成型  比如 先弄简单迭代 弄明白了 结果准确了 在研究复杂迭代

[此贴子已经被作者于2015-12-29 16:20编辑过]


DO IT YOURSELF !
2015-12-29 16:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-460650-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.987696 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved