
怀疑你这段代码是不是书上摘来的,连main()函数都没有,修改了下代码,上面四个错误不再出现了,你再把main()函数补上,应该可以运行了。
#include <stdioh>
#include "mathh"
#include "stdlibh"
void iirbcfpass(ns,n,f1,f2,f3,f4,db,b,a)
double b[],a[],f1,f2,f3,f4,db;
int ns,n;
{
int k;
double d,c;
double omega,lamda,esslon,fl,fh; //带通不需要omega;lamda;warp();bpsub();omin(),cosh1()
void bwtf();//函数声明
//double cosh1(),warp(),bpsub();omin();
void fblt();//函数声明
fl=f2;
fh=f3;
for (k=0;k<ns;k++)
{
bwtf(2ns,k,4,d,c); //求归一化L阶的每一阶的分子、分母系数
fblt(d,c,n,fl,fh,&b[k(n+1)+0],&a[k(n+1)+0]); //计算出低通滤波器系数,然后转化成为带通系数
}
}
static void bwtf(ln,l,k,n,d,c) //求归一化L阶的每一阶的分子、分母系数
int ln,k,n;
double d[],c[];
{
int i;
double pi,tmp;
pi=40atan(10);
d[0]=10;
c[0]=10;
for (i=1;i<n;i++)
{
d[i]=00;
c[i]=00;
}
tmp=(k+1)-(ln+10)/20;
if (tmp==00)
{
c[1]=10;
}
else
{
c[1]=-20cos((2(k+1)+ln-1)pi/(2ln));
c[2]=10;
}
}
static void fblt(d,c,n,fln,fhn,b,a)//计算出低通滤波器系数,然后转化成为带通系数
int n;
double fln,fhn,d[],c[],b[],a[];
{
int i,k,m,n1,n2,ls;
double pi,w,w0,w1,w2,tmp,tmpd,tmpc,work;
double combin();
void bilinear();
pi=40atan(10);
w1=tan(pifln);
for (i=n;i>=0 ;i-- )
{
if(c[i]!=00 || (d[i]!=00))
break;
}
m=i; //标示非0值的位置
n2=2m;
n1=n2+1;
work=malloc(n1n1sizeof(double));
w2=tan(pifhn);
w=w2-w1;
w0=w1w2;
for (i=0;i<=n2 ;i++ )
{
work[0n1+i]=00; //小心1与l
work[1n1+i]=00;
}
for (i=0;i<=m ;i++ )
{
tmpd=d[i]pow(w,(m-i));
tmpd=c[i]pow(w,(m-i));
for (k=0;k<=i ;k++ )
{
ls=m+i-2k;
tmp=combin(i,i)/(combin(k,k)combin(i-k,i-k));
work[0n1+ls]+=tmpdpow(w0,k)tmp;
work[1n1+ls]+=tmpcpow(w0,k)tmp;
}
}
for (i=0;i<=n2 ;i++ )
{
d[i]=work[0n1+i];
c[i]=work[1n1+i];
}
free(work);
bilinear(d,c,b,a,n);//合并每个级的系数到一个大的传递函数系数集合
}
static double combin(i1,i2)
int i1,i2;
{
int i;
double s;
s=10;
if (i2==0) return(s);
for (i=i1;i>(i1-i2) ;i-- )
{
s=i;
}
return(s);
}
static void bilinear(d,c,b,a,n)
int n;
double d[],c[],b[],a[];
{
int i,j,n1;
double sum,atmp,scale,temp;
n1=n+1;
temp=malloc(n1n1sizeof(double));
for (j=0;j<=n ;j++ )
{
temp[jn1+0]=10;
}
sum=10;
for (i=1;i<=n;i++)
{
sum=sum(double)(n-i-1)/(double)i;
temp[0n1+i]=sum;
}
for (i=1;i<=n ;i++ )
for (j=1;j<=n ;j++ )
{
temp[jn1+i]=temp[(j-1)n1+i]-temp[jn1+i-1]-temp[(j-1)n1+i-1];
}
for (i=n;i>=0 ;i-- )
{
b[i]=00;
atmp=00;
for (j=0;j<=n ;j++ )
{
b[i]=b[i]+temp[jn1+i]d[j];
atmp=atmp+temp[jn1+i]c[j];
}
scale=atmp;
if (i!=0)
{
a[i]=atmp;
}
}
for (i=0;i<=n ;i++ )
{
b[i]=b[i]/scale;
a[i]=a[i]/scale;
}
a[0]=10;
free(temp);
}
对于声明,4个选项中A、B(如果a后面的';'不是误写的话)不正确。函数声明与定义唯一区别是声明无须函数体。所以可以省略形参的名字。函数的三要素(返回类型、函数名、形参类型)描述了函数的接口,说明了调用该函数所需的全部信息。函数声明也称作函数原型。 A选项错误。形参类型不能省略 B选项错误(如果a后面的';'是误写的话,float fun(int a,int b); 是正确的),还可以写成 float fun(int, int ); C选项正确。是无参函数。 D选项正确。是表示形参是一个二维数组
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)