如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:
成都网站建设哪家好,找成都创新互联公司!专注于网页设计、重庆网站建设、微信开发、微信平台小程序开发、集团成都定制网站等服务项目。核心团队均拥有互联网行业多年经验,服务众多知名企业客户;涵盖的客户类型包括:混凝土搅拌罐车等众多领域,积累了大量丰富的经验,同时也获得了客户的一致称赞!
int
WhyCoding(int
a,
float
b);
做法是,
/*
cpp_a.h
*/
extern
"C"
{
#include
"a.h"
}
或
/*
cpp_a.h
*/
extern
"C"
{
int
WhyCoding(int
a,
float
b);
/*
重定义所有的C函数
*/
}
从上面可以看出,extern
"C"
是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带
函数的类型信息,只包含函数符号名字,如C编译器把函数int
a(float
x)编译成类似_a这样的符号,C连接器只要
找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的
符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数
重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern
"C"
的
作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++
方式编译,用了extern
"C"
后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式
编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C
调用C++了).
相反,C++调用C函数,extern
"C"
的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是
_a_float来找调用函数。
你的意思是说,输入一些数据,让程序拟合出来一个函数。
这个很复杂。比如我举个例子。
多项式拟合函数polyfit之C语言的源码
2010-11-25 10:05:57| 分类: VC++编程 | 标签:double poly_n polyfit int for |字号 订阅
#include stdio.h
#include conio.h
#include stdlib.h
#include math.h
main()
{
int i,j,m,n=7,poly_n=2;
double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};
double a[3];
void polyfit(int n,double *x,double *y,int poly_n,double a[]);
system("cls");
polyfit(n,x,y,poly_n,a);
for (i=0;ipoly_n+1;i++)/*这里是升序排列,Matlab是降序排列*/
printf("a[%d]=%g\n",i,a[i]);
getch();
}
/*==================polyfit(n,x,y,poly_n,a)===================*/
/*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
/*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
/*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double a[])
{
int i,j;
double *tempx,*tempy,*sumxx,*sumxy,*ata;
void gauss_solve(int n,double A[],double x[],double b[]);
tempx=calloc(n,sizeof(double));
sumxx=calloc(poly_n*2+1,sizeof(double));
tempy=calloc(n,sizeof(double));
sumxy=calloc(poly_n+1,sizeof(double));
ata=calloc((poly_n+1)*(poly_n+1),sizeof(double));
for (i=0;in;i++)
{
tempx[i]=1;
tempy[i]=y[i];
}
for (i=0;i2*poly_n+1;i++)
for (sumxx[i]=0,j=0;jn;j++)
{
sumxx[i]+=tempx[j];
tempx[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (sumxy[i]=0,j=0;jn;j++)
{
sumxy[i]+=tempy[j];
tempy[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (j=0;jpoly_n+1;j++)
ata[i*(poly_n+1)+j]=sumxx[i+j];
gauss_solve(poly_n+1,ata,a,sumxy);
free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}
void gauss_solve(int n,double A[],double x[],double b[])
{
int i,j,k,r;
double max;
for (k=0;kn-1;k++)
{
max=fabs(A[k*n+k]); /*find maxmum*/
r=k;
for (i=k+1;in-1;i++)
if (maxfabs(A[i*n+i]))
{
max=fabs(A[i*n+i]);
r=i;
}
if (r!=k)
for (i=0;in;i++) /*change array:A[k]A[r] */
{
max=A[k*n+i];
A[k*n+i]=A[r*n+i];
A[r*n+i]=max;
}
max=b[k]; /*change array:b[k]b[r] */
b[k]=b[r];
b[r]=max;
for (i=k+1;in;i++)
{
for (j=k+1;jn;j++)
A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
b[i]-=A[i*n+k]*b[k]/A[k*n+k];
}
}
所以这种程序是超级大型的,一般没人能独立写出来。
编程计算器和一些程序能实现,但是源代码都是不公布的。
C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,计算和的方法为:
1、新建一个求1到100自然数之和项目。
2、添加一个cpp文件。
3、包含需要用到的头文件。
4、输入main函数。
5、定义两个变量,分别是:a和sum。
6、使用while语句计算1到100之间所有自然数之和。
7、运行程序,打印出结果。
注意事项:
C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
第三个函数
#includestdio.h
void
main()
{
int
a,b,back;
int
mulnum(int
a,int
b);
printf("请输入两个整数:");
scanf("%d%d",a,b);
back=mulnum(a,b);
if(back==1)
printf("%d
is
multiple
of
%d\n",a,b);
else
if(back==2)
printf("%d
is
multiple
of
%d\n",b,a);
else
;
}
int
mulnum(int
a,int
b)
{
double
result;
if((result=a%b)==0)
return
1;
else
if((result=b%a)==0)
return
2;
else
return
0;
}
这个函数能技能判断a是否为b的倍数,还能判断b是否为a的倍数。楼主如果不需要第二个功能,把else
if语句
去掉就行了。
网站栏目:如何用c语言求函数实现 c语言怎么用数学函数
浏览地址:https://www.cdcxhl.com/article34/dosdspe.html
成都网站建设公司_创新互联,为您提供网站制作、商城网站、网站改版、做网站、企业建站、外贸网站建设
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联