如何調用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語言怎么用數學函數
瀏覽地址:http://vcdvsql.cn/article34/dosdspe.html
成都網站建設公司_創新互聯,為您提供網站制作、商城網站、網站改版、做網站、企業建站、外貿網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯