2016-07-19 5 views
0

基本的に動作するプログラムを変更しようとして問題があります。私はずっと前に私の友人(今遠く離れている)の友人からプログラムのこの束を得て、彼らはうまくいくはずです。しかし、おそらく動作するコードをコンパイルしようとするとエラーになります。エラー: 'fmin'の相反するタイプ

プログラムでは数値レシピのライブラリ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でコンパイルしようとしています。

事前に感謝します。

+0

類似の問題(異なる機能名のみ)[ここに**見つけられる**](https://stackoverflow.com/questions/33572503/conflicting-types-error) – WhozCraig

答えて

1

fminは、ヘッダmath.h(引数はdouble)にあらかじめ定義された関数です。

"recipes/nr.h"という名前のユーザー定義関数が、fminという名前の異なる署名を持つ関数を持つということが起こっています。

したがって、コンパイラによるエラー。ヘッダーファイル内の関数の名前を変更すると、エラーが解決されます。

関連する問題