错误:'fmin'的冲突类型

时间:2016-07-19 04:52:11

标签: c compilation

我试图改变基本上有效的程序时遇到问题。我不久前从我的一个(现在遥远的)朋友那里得到了这一系列程序,他们应该工作正常。但是,当我尝试编译可能正常工作的代码时,我收到错误。

程序使用数字配方中的库nr.h和nrutil.h,并且都包含声明 fmin

代码是:

#include <stdio.h>
#include <math.h>
#include "recipes/nrutil.h"
#include "recipes/nr.h"


float s(float t, float omega);
float c(float t, float omega);
void DFT(int dir, int N, float** mat);

int main(int argc, char* argv[])
{
    int i,j;
    int N=100;
    float** mat=matrix(1,2,0,N);
    float tmp;

    for (i=0;i<=N;i++){
        tmp=s((1.0*i)/N,1.0);
        if (tmp>=0.5) mat[1][i]=0.5;
        else if (tmp<=0.5) mat[1][i]=-0.5;
        else mat[1][i]=tmp;
        mat[2][i]=0.0;
    }

    DFT(1,N,mat);
    DFT(-1,N,mat);
    FILE* fout=fopen("test.dat","w+");
/*  
    for (i=0;i<=N;i++)
        fprintf(fout,"%d %0.16e %0.16e %0.16e\n",i
                                                                                      ,mat[1][i]
                                                                                        ,mat[2][i]
                                                                                        ,s((1.0*i)/N,8.5)-mat[1][i]);
*/

    for (i=0;i<=N;i++)
        fprintf(fout,"%e %0.16e %0.16e %0.16e %d %0.16e\n",(i-N/2)*1.0/N
                                                                                                          ,mat[1][i]
                                                                                                            ,mat[2][i]
                                                                                                            ,sqrt(SQR(mat[1][i])+SQR(mat[2][i]))
                                                                                                            ,i
                                                                                                            ,s((1.0*i)/N,1.0));

    fclose(fout);

    free_matrix(mat,1,2,0,N);
    return (0);
}


float s(float t, float omega)
{
    return (sin(2*M_PI*omega*t));
}

float c(float t, float omega)
{
    return (cos(2*M_PI*omega*t));
}

void DFT(int dir, int N, float** mat)
{
    int i,k;
    float arg;
    float cosarg,sinarg;
    float** mat2=matrix(1,2,0,N);

    if (dir==1){    
        for (i=-N/2;i<=N/2;i++){
            mat2[1][i+N/2]=0;
            mat2[2][i+N/2]=0;
            arg=-dir*2.0*M_PI*(float)i/(float)N;
            for (k=0;k<N;k++){
                cosarg=cos(k*arg);
                sinarg=sin(k*arg);
                mat2[1][i+N/2]+=mat[1][k]*cosarg-mat[2][k]*sinarg;
                mat2[2][i+N/2]+=mat[1][k]*sinarg+mat[2][k]*cosarg;
            }
        }
        for (i=0;i<=N;i++){
            mat[1][i]=mat2[1][i]/(float)N;
            mat[2][i]=mat2[2][i]/(float)N;
        }
    } 
    else{
        for (k=0;k<=N;k++){
            mat2[1][k]=0;
            mat2[2][k]=0;
            arg=-dir*2.0*M_PI*(float)k/(float)N;
            for (i=-N/2;i<=N/2;i++){
                cosarg=cos(i*arg);
                sinarg=sin(i*arg);
                mat2[1][k]+=mat[1][i+N/2]*cosarg-mat[2][i+N/2]*sinarg;
                mat2[2][k]+=mat[1][i+N/2]*sinarg+mat[2][i+N/2]*cosarg;
            }
        }
        for (i=0;i<=N;i++){
            mat[1][i]=mat2[1][i];
            mat[2][i]=mat2[2][i];
        }
    }

    free_matrix(mat2,1,2,0,N);
}

现在当我尝试编译程序时,我收到一条错误消息:

 In file included from nal01a.c:12:0: recipes/nr.h:188:7: error:
 conflicting types for ‘fmin’  float fmin(float x[]);

 In file included from nal01a.c:10:0: /usr/include/math.h:289:15: note: previous declaration of ‘fmin’ was
 here  extern double fmin _PARAMS((double, double));

原始程序员能够运行相同的程序,但我无法编译它。可能是什么原因?我正在尝试用Cygwin编译它。

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

fmin是标头math.h中的预定义函数(其参数为double)。

正在发生的事情是,您的头文件中有一个名为"recipes/nr.h"的用户定义函数,该函数具有名为fmin但具有不同签名的函数。

因此,编译错误。在头文件中更改函数的名称,错误应该解决。