⑴ 函數中線程和函數的執行順序
執行的順序為先執行函數,然後再執行函數中御賣悶的線程,因為這一個線程的調用存在於這一個函數之中,只有當該函數執行之後才會執行到線程的調用,所以說先執行函數,然後才會執行函數中的線程。
函數是指一段可以直接被另一段程序或代碼引用的程序或代碼。這段代碼可以寫是一段線程的調用函數,以此可以為程序增加一個線程。
線程為操作系統能夠進行運算鎮彎調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。因為線程包含在進程之中,也就造就了他不可能比包含線程的函數先運行。
線程的主要適用范圍:
1、伺服器中的文件管理或通信控制。
2、前後台處理。
3、非同步處理。
線程的特點:
1、作為線程,線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源,為一個輕量型的實體。
2、線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單配空位,因為比較的輕量,所以線程切換開銷較小。
3、線程之間可以並發的進行,同時他們可以共享該進程的資源。
以上內容參考:網路-線程
⑵ c語言中怎麼調用自定義函數
可以的,前提是,在使用一個函數之前必須先對他進行聲明:
//void B();聲明B函數的存在。
void A()
{
B();//非法,程序執行到此時並不知道B函數的存在。
}
void B()
{
}
或者
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int fa(int n)
{
int a;
for(a=2;a<=sqrt(n*1.0),n%a!=0;a++);
if(a>sqrt(n*1.0))
return(1);
else
return(0);
}
void main( )
{
int n,q;
scanf("%d",&n);
從函數定義的角度看,函數可分為庫函數和用戶定義函數兩種。
(1)庫函稿判數
由C系統銷飢提供,用戶無須定義, 也不必在程序中作類型說明,只需在程序前包含有該函數原型的頭文件即可在程序中直接調用。在前面各章的例題中反復用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等函數鍵斗改均屬此類。
(2)用戶定義函數
由用戶按需要寫的函數。對於用戶自定義函數, 不僅要在程序中定義函數本身, 而且在主調函數模塊中還必須對該被調函數進行類型說明,然後才能使用。
⑶ 我需要c語言每個頭文件里的所有函數介紹及用法!
分類函數,所在函數庫為ctype.h
int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0
int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9')
返回非0值,否則返回0
int isascii(int ch) 若ch是字元(ASCII碼中的0-127)返回非0值,否則返回0
int iscntrl(int ch) 若ch是作廢字元(0x7F)或普通控制字元(0x00-0x1F)
返回非0值,否則返回0
int isdigit(int ch) 若ch是數字('0'-'9')返回非0值,否則返回0
int isgraph(int ch) 若ch是可列印字元(不含空格)(0x21-0x7E)返回非0值,否則返回0
int islower(int ch) 若ch是宏悉小寫字母('a'-'z')返回非0值,否則返回0
int isprint(int ch) 若ch是可列印字元(含空格)(0x20-0x7E)返回非0值,否則返回0
int ispunct(int ch) 若ch是標點字元(0x00-0x1F)返回非0值,否則返回0
int isspace(int ch) 若ch是空格(' '),水平製表符('\t'),回車符('\r'),
走紙換行('\f'),垂直製表符('\v'),換行符('\n')
返回非0值,否胡枝則返回0
int isupper(int ch) 若ch是大寫字母('A'-'Z')返回非0值,否則返回0
int isxdigit(int ch) 若ch是16進制褲絕敏數('0'-'9','A'-'F','a'-'f')返回非0值,
否則返回0
int tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')
int toupper(int ch) 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')
數學函數,所在函數庫為math.h、stdlib.h、string.h、float.h
int abs(int i) 返回整型參數i的絕對值
double cabs(struct complex znum) 返回復數znum的絕對值
double fabs(double x) 返回雙精度參數x的絕對值
long labs(long n) 返回長整型參數n的絕對值
double exp(double x) 返回指數函數ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存貯在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反餘弦cos-1(x)值,x為弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x為弧度
double atan(double x) 返回x的反正切tan-1(x)值,x為弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x為弧度
double cos(double x) 返回x的餘弦cos(x)值,x為弧度
double sin(double x) 返回x的正弦sin(x)值,x為弧度
double tan(double x) 返回x的正切tan(x)值,x為弧度
double cosh(double x) 返回x的雙曲餘弦cosh(x)值,x為弧度
double sinh(double x) 返回x的雙曲正弦sinh(x)值,x為弧度
double tanh(double x) 返回x的雙曲正切tanh(x)值,x為弧度
double hypot(double x,double y) 返回直角三角形斜邊的長度(z),
x和y為直角邊的長度,z2=x2+y2
double ceil(double x) 返回不小於x的最小整數
double floor(double x) 返回不大於x的最大整數
void srand(unsigned seed) 初始化隨機數發生器
int rand() 產生一個隨機數並返回這個數
double poly(double x,int n,double c[])從參數產生一個多項式
double modf(double value,double *iptr)將雙精度數value分解成尾數和階
double fmod(double x,double y) 返回x/y的余數
double frexp(double value,int *eptr) 將雙精度數value分成尾數和階
double atof(char *nptr) 將字元串nptr轉換成浮點數並返回這個浮點數
double atoi(char *nptr) 將字元串nptr轉換成整數並返回這個整數
double atol(char *nptr) 將字元串nptr轉換成長整數並返回這個整數
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字元串並返回該字元串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字元串並返回該字元串
char *gcvt(double value,int ndigit,char *buf)
將數value轉換成字元串並存於buf中,並返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號整型數value轉換成字元串並返回該字元串,radix為轉換時所用基數
char *ltoa(long value,char *string,int radix)
將長整型數value轉換成字元串並返回該字元串,radix為轉換時所用基數
char *itoa(int value,char *string,int radix)
將整數value轉換成字元串存入string,radix為轉換時所用基數
double atof(char *nptr) 將字元串nptr轉換成雙精度數,並返回這個數,錯誤返回0
int atoi(char *nptr) 將字元串nptr轉換成整型數, 並返回這個數,錯誤返回0
long atol(char *nptr) 將字元串nptr轉換成長整型數,並返回這個數,錯誤返回0
double strtod(char *str,char **endptr)將字元串str轉換成雙精度數,並返回這個數,
long strtol(char *str,char **endptr,int base)將字元串str轉換成長整型數,
並返回這個數,
int matherr(struct exception *e)
用戶修改數學錯誤返回信息函數(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數學錯誤返回信息函數(沒有必要使用)
unsigned int _clear87() 清除浮點狀態字並返回原來的浮點狀態
void _fpreset() 重新初使化浮點數學程序包
unsigned int _status87() 返回浮點狀態字
int chdir(char *path) 使指定的目錄path(如:"C:\\WPS")變成當前的工作目錄,成
功返回0
int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功
返回0
pathname為指定的目錄名和文件名,如"C:\\WPS\\TXT"
ffblk為指定的保存文件信息的一個結構,定義如下:
┏━━━━━━━━━━━━━━━━━━━━┓
┃struct ffblk ┃
┃{ ┃
┃ char ff_reserved[21]; /*DOS保留字*/ ┃
┃ char ff_attrib; /*文件屬性*/ ┃
┃ int ff_ftime; /*文件時間*/ ┃
┃ int ff_fdate; /*文件日期*/ ┃
┃ long ff_fsize; /*文件長度*/ ┃
┃ char ff_name[13]; /*文件名*/ ┃
┃} ┃
┗━━━━━━━━━━━━━━━━━━━━━┛
attrib為文件屬性,由以下字元代表
┏━━━━━━━━━┳━━━━━━━━━┓
┃FA_RDONLY 只讀文件┃FA_LABEL 卷標號 ┃
┃FA_HIDDEN 隱藏文件┃FA_DIREC 目錄 ┃
┃FA_SYSTEM 系統文件┃FA_ARCH 檔案 ┃
┗━━━━━━━━━┻━━━━━━━━━┛
例:
struct ffblk ff;
findfirst("*.wps",&ff,FA_RDONLY);
int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函數通過盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴展名ext(.EXE、.COM等)組成一個文件名
存與path中.
int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)
此函數將文件名path分解成盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴展名ext(.EXE、.COM等),並分別存入相應的變數中.
int getcurdir(int drive,char *direc) 此函數返回指定驅動器的當前工作目錄名稱
drive 指定的驅動器(0=當前,1=A,2=B,3=C等)
direc 保存指定驅動器當前工作路徑的變數 成功返回0
char *getcwd(char *buf,iint n) 此函數取當前工作目錄並存入buf中,直到n個字
節長為為止.錯誤返回NULL
int getdisk() 取當前正在使用的驅動器,返回一個整數(0=A,1=B,2=C等)
int setdisk(int drive) 設置要使用的驅動器drive(0=A,1=B,2=C等),
返回可使用驅動器總數
int mkdir(char *pathname) 建立一個新的目錄pathname,成功返回0
int rmdir(char *pathname) 刪除一個目錄pathname,成功返回0
char *mktemp(char *template) 構造一個當前目錄上沒有的文件名並存於template中
char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路徑,
,此函數使用DOS的PATH變數,未找到文件返回NULL
進程函數,所在函數庫為stdlib.h、process.h
void abort() 此函數通過調用具有出口代碼3的_exit寫一個終止信息於stderr,
並異常終止程序。無返回值
int exec…裝入和運行其它程序
int execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,…,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,…,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char *envp[])
exec函數族裝入並運行程序pathname,並將參數
arg0(arg1,arg2,argv[],envp[])傳遞給子程序,出錯返回-1
在exec函數族中,後綴l、v、p、e添加到exec後,
所指定的函數將具有某種操作能力
有後綴 p時,函數可以利用DOS的PATH變數查找子程序文件。
l時,函數中被傳遞的參數個數固定。
v時,函數中被傳遞的參數個數不固定。
e時,函數傳遞指定參數envp,允許改變子進程的環境,
無後綴e時,子進程使用當前程序的環境。
void _exit(int status)終止當前程序,但不清理現場
void exit(int status) 終止當前程序,關閉所有文件,寫緩沖區的輸出(等待輸出),
並調用任何寄存器的"出口函數",無返回值
int spawn…運行子程序
int spawnl( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnle( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnlp( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnlpe(int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnv( int mode,char *pathname,char *argv[])
int spawnve( int mode,char *pathname,char *argv[],char *envp[])
int spawnvp( int mode,char *pathname,char *argv[])
int spawnvpe(int mode,char *pathname,char *argv[],char *envp[])
spawn函數族在mode模式下運行子程序pathname,並將參數
arg0(arg1,arg2,argv[],envp[])傳遞給子程序.出錯返回-1
mode為運行模式
mode為 P_WAIT 表示在子程序運行完後返回本程序
P_NOWAIT 表示在子程序運行時同時運行本程序(不可用)
P_OVERLAY表示在本程序退出後運行子程序
在spawn函數族中,後綴l、v、p、e添加到spawn後,
所指定的函數將具有某種操作能力
有後綴 p時, 函數利用DOS的PATH查找子程序文件
l時, 函數傳遞的參數個數固定.
v時, 函數傳遞的參數個數不固定.
e時, 指定參數envp可以傳遞給子程序,允許改變子程序運行環境.
當無後綴e時,子程序使用本程序的環境.
int system(char *command) 將MSDOS命令command傳遞給DOS執行
轉換子程序,函數庫為math.h、stdlib.h、ctype.h、float.h
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字元串並返回該字元串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字元串並返回該字元串
char *gcvt(double value,int ndigit,char *buf)
將數value轉換成字元串並存於buf中,並返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號整型數value轉換成字元串並返回該字元串,radix為轉換時所用基數
char *ltoa(long value,char *string,int radix)
將長整型數value轉換成字元串並返回該字元串,radix為轉換時所用基數
char *itoa(int value,char *string,int radix)
將整數value轉換成字元串存入string,radix為轉換時所用基數
double atof(char *nptr) 將字元串nptr轉換成雙精度數,並返回這個數,錯誤返回0
int atoi(char *nptr) 將字元串nptr轉換成整型數, 並返回這個數,錯誤返回0
long atol(char *nptr) 將字元串nptr轉換成長整型數,並返回這個數,錯誤返回0
double strtod(char *str,char **endptr)將字元串str轉換成雙精度數,並返回這個數,
long strtol(char *str,char **endptr,int base)將字元串str轉換成長整型數,
並返回這個數,
int toascii(int c) 返回c相應的ASCII
int tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')
int _tolower(int ch) 返回ch相應的小寫字母('a'-'z')
int toupper(int ch) 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')
int _toupper(int ch) 返回ch相應的大寫字母('A'-'Z')
診斷函數,所在函數庫為assert.h、math.h
void assert(int test) 一個擴展成if語句那樣的宏,如果test測試失敗,
就顯示一個信息並異常終止程序,無返回值
void perror(char *string) 本函數將顯示最近一次的錯誤信息,格式如下:
字元串string:錯誤信息
char *strerror(char *str) 本函數返回最近一次的錯誤信息,格式如下:
字元串str:錯誤信息
int matherr(struct exception *e)
用戶修改數學錯誤返回信息函數(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數學錯誤返回信息函數(沒有必要使用)
⑷ 怎樣在C#中調用DLL中的函數,最好有代碼和詳細說明
首先,應該在C#語言源程序中聲明外部方法,其基本形式是:[DLLImport(「DLL文件」)]修飾符 extern 返回變數類型 方法名稱 (參數列表)其中:DLL文件:轎行包含定義外部方法的庫文件。修飾符: 訪問修飾符,除了abstract以外在聲明方法時可以使用的修飾符。返回變數類型:在DLL文件中你需調用方法的返回變數類型。方法名稱:在DLL文件中你需調用方法的名稱。參數列表:在DLL文件中你需調用方法的列表。注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。 DllImport只能放置在方法聲明上。DLL文件必須位於程序當前目錄或系統定義的查詢路徑中(即:系統環境變數中Path所設置的路徑)。返回變數類型、方法名稱、參數列表一定要與DLL文件中的定義相一致。若要使用其它函數名,可以使用EntryPoint屬性設置,如:[DllImport("user32.dll", EntryPoint="MessageBoxA")]static extern int MsgBox(int hWnd, string msg, string caption, int type);其它可選的 DllImportAttribute 屬性:CharSet 指示用在入口點中的字元集,如:CharSet=CharSet.Ansi;SetLastError 指示方法是否保留 Win32"上一錯誤",如:SetLastError=true;ExactSpelling 指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配,如:ExactSpelling=false;PreserveSig指示方法的簽名應當被保留還是被轉換, 如:PreserveSig=true;CallingConvention指示入口點的調用約定, 如:CallingConvention=CallingConvention.Winapi;此外,關於「數據封送處理」及「封送數字和邏輯標量」請參閱其它一些文章[2]。C#例子:1. 啟動VS.NET,新建一個項目,項目名稱為「Tzb」,模板為「Windows 應用程序」。2. 在「工具箱」的「 Windows 窗體」項中雙擊「Button」項,向「Form1」窗頃告體中添加一個按鈕。3. 改變按鈕的屬性:Name為 「B1」,Text為 「用DllImport調用DLL彈出提示框」,並將按鈕B1調整到適當大小,移到適當位置。4. 在類視圖中雙擊「Form1」,打開「Form1.cs」代碼視圖,在「namespace Tzb」上面輸入「using System.Runtime.InteropServices;」,以導入該命名空間。5. 在「Form1.cs[設計]」視圖中雙擊按鈕B1,在「B1_Click」方法上面使用關鍵字 static 和 extern 聲明方法「MsgBox」,將 DllImport 屬性附加到該方法,這里我們要使用的是「user32.dll」中的「MessageBoxA」函數,具體代碼如下:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]static extern int MsgBox(int hWnd, string msg, string caption, int type);
然後在「B1_Click」方法體內添雀帆明加如下代碼,以調用方法「MsgBox」:
MsgBox(0," 這就是用 DllImport 調用 DLL 彈出的提示框哦! "," 挑戰杯 ",0x30);6. 按「F5」運行該程序,並點擊按鈕B1,便彈出如下提示框:(二) 動態裝載、調用DLL中的非託管函數在上面已經說明了如何用DllImport調用DLL中的非託管函數,但是這個是全局的函數,假若DLL中的非託管函數有一個靜態變數S,每次調用這個函數的時候,靜態變數S就自動加1。結果,當需要重新計數時,就不能得出想要的結果。下面將用例子說明:1. DLL的創建1) 啟動Visual C++ 6.0;2) 新建一個「Win32 Dynamic-Link Library」工程,工程名稱為「Count」;3) 在「Dll kind」選擇界面中選擇「A simple dll project」;4) 打開Count.cpp,添加如下代碼:
// 導出函數,使用「 _stdcall 」 標准調用extern "C" _declspec(dllexport)int _stdcall count(int init);int _stdcall count(int init){//count 函數,使用參數 init 初始化靜態的整形變數 S ,並使 S 自加 1 後返回該值static int S=init;S++;return S;}
5) 按「F7」進行編譯,得到Count.dll(在工程目錄下的Debug文件夾中)。2. 用DllImport調用DLL中的count函數1) 打開項目「Tzb」,向「Form1」窗體中添加一個按鈕。2) 改變按鈕的屬性:Name為 「B2」,Text為 「用DllImport調用DLL中count函數」,並將按鈕B1調整到適當大小,移到適當位置。3) 打開「Form1.cs」代碼視圖,使用關鍵字 static 和 extern 聲明方法「count」,並使其具有來自 Count.dll 的導出函數count的實現,代碼如下:
[DllImport("Count.dll")]static extern int count(int init);
4) 在「Form1.cs[設計]」視圖中雙擊按鈕B2,在「B2_Click」方法體內添加如下代碼:
MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參為 0 ,得到的結果是: "+count(0).ToString()," 挑戰杯 ");MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參為 10 ,得到的結果是: "+count(10).ToString()+"n 結果可不是想要的 11 哦!!! "," 挑戰杯 ");MessageBox.Show(" 所得結果表明: n 用 DllImport 調用 DLL 中的非託管 n 函數是全局的、靜態的函數!!! "," 挑戰杯 ");5) 把Count.dll復制到項目「Tzb」的binDebug文件夾中,按「F5」運行該程序,並點擊按鈕B2,便彈出如下三個提示框:
第1個提示框顯示的是調用「count(0)」的結果,第2個提示框顯示的是調用「count(10)」的結果,由所得結果可以證明「用DllImport調用DLL中的非託管函數是全局的、靜態的函數」。所以,有時候並不能達到我們目的,因此我們需要使用下面所介紹的方法:C#動態調用DLL中的函數。 3. C#動態調用DLL中的函數因為C#中使用DllImport是不能像動態load/unload assembly那樣,所以只能藉助API函數了。在kernel32.dll中,與動態庫調用有關的函數包括[3]:①LoadLibrary(或MFC 的AfxLoadLibrary),裝載動態庫。②GetProcAddress,獲取要引入的函數,將符號名或標識號轉換為DLL內部地址。③FreeLibrary(或MFC的AfxFreeLibrary),釋放動態鏈接庫。它們的原型分別是:HMODULE LoadLibrary(LPCTSTR lpFileName);FARPROC GetProcAddress(HMODULE hMole, LPCWSTR lpProcName);BOOL FreeLibrary(HMODULE hMole);現在,我們可以用IntPtr hMole=LoadLibrary(「Count.dll」);來獲得Dll的句柄,用IntPtr farProc=GetProcAddress(hMole,」_count@4」);來獲得函數的入口地址。但是,知道函數的入口地址後,怎樣調用這個函數呢?因為在C#中是沒有函數指針的,沒有像C++那樣的函數指針調用方式來調用函數,所以我們得藉助其它方法。經過研究,發現我們可以通過結合使用System.Reflection.Emit及System.Reflection.Assembly里的類和函數達到我們的目的。為了以後使用方便及實現代碼的復用,我們可以編寫一個類。1) dld類的編寫:1. 打開項目「Tzb」,打開類視圖,右擊「Tzb」,選擇「添加」-->「類」,類名設置為「dld」,即dynamic loading dll 的每個單詞的開頭字母。2. 添加所需的命名空間及聲明參數傳遞方式枚舉:
using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空間using System.Reflection; // 使用 Assembly 類需用此 命名空間using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空間
在「public class dld」上面添加如下代碼聲明參數傳遞方式枚舉:
/// <summary>/// 參數傳遞方式枚舉 ,ByValue 表示值傳遞 ,ByRef 表示址傳遞/// </summary>public enum ModePass{ByValue = 0x0001,ByRef = 0x0002}3. 聲明LoadLibrary、GetProcAddress、FreeLibrary及私有變數hMole和farProc:
/// <summary>/// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);/// </summary>/// <param name="lpFileName">DLL 文件名 </param>/// <returns> 函數庫模塊的句柄 </returns>[DllImport("kernel32.dll")]static extern IntPtr LoadLibrary(string lpFileName);/// <summary>/// 原型是 : FARPROC GetProcAddress(HMODULE hMole, LPCWSTR lpProcName);/// </summary>/// <param name="hMole"> 包含需調用函數的函數庫模塊的句柄 </param>/// <param name="lpProcName"> 調用函數的名稱 </param>/// <returns> 函數指針 </returns>[DllImport("kernel32.dll")]static extern IntPtr GetProcAddress(IntPtr hMole, string lpProcName);/// <summary>/// 原型是 : BOOL FreeLibrary(HMODULE hMole);/// </summary>/// <param name="hMole"> 需釋放的函數庫模塊的句柄 </param>/// <returns> 是否已釋放指定的 Dll</returns>[DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)]static extern bool FreeLibrary(IntPtr hMole);/// <summary>/// Loadlibrary 返回的函數庫模塊的句柄/// </summary>private IntPtr hMole=IntPtr.Zero;/// <summary>/// GetProcAddress 返回的函數指針/// </summary>private IntPtr farProc=IntPtr.Zero;4. 添加LoadDll方法,並為了調用時方便,重載了這個方法:
/// <summary>/// 裝載 Dll/// </summary>/// <param name="lpFileName">DLL 文件名 </param>public void LoadDll(string lpFileName){hMole=LoadLibrary(lpFileName);if(hMole==IntPtr.Zero)throw(new Exception(" 沒有找到 :"+lpFileName+"." ));} 若已有已裝載Dll的句柄,可以使用LoadDll方法的第二個版本:
public void LoadDll(IntPtr HMODULE){if(HMODULE==IntPtr.Zero)throw(new Exception(" 所傳入的函數庫模塊的句柄 HMODULE 為空 ." ));hMole=HMODULE;}5. 添加LoadFun方法,並為了調用時方便,也重載了這個方法,方法的具體代碼及注釋如下:
/// <summary>/// 獲得函數指針/// </summary>/// <param name="lpProcName"> 調用函數的名稱 </param>public void LoadFun(string lpProcName){ // 若函數庫模塊的句柄為空,則拋出異常if(hMole==IntPtr.Zero)throw(new Exception(" 函數庫模塊的句柄為空 , 請確保已進行 LoadDll 操作 !"));// 取得函數指針farProc = GetProcAddress(hMole,lpProcName);// 若函數指針,則拋出異常if(farProc==IntPtr.Zero)throw(new Exception(" 沒有找到 :"+lpProcName+" 這個函數的入口點 "));}/// <summary>/// 獲得函數指針/// </summary>/// <param name="lpFileName"> 包含需調用函數的 DLL 文件名 </param>/// <param name="lpProcName"> 調用函數的名稱 </param>public void LoadFun(string lpFileName,string lpProcName){ // 取得函數庫模塊的句柄hMole=LoadLibrary(lpFileName);// 若函數庫模塊的句柄為空,則拋出異常if(hMole==IntPtr.Zero)throw(new Exception(" 沒有找到 :"+lpFileName+"." ));// 取得函數指針farProc = GetProcAddress(hMole,lpProcName);// 若函數指針,則拋出異常if(farProc==IntPtr.Zero)throw(new Exception(" 沒有找到 :"+lpProcName+" 這個函數的入口點 "));}6. 添加UnLoadDll及Invoke方法,Invoke方法也進行了重載:
/// <summary>/// 卸載 Dll/// </summary>public void UnLoadDll(){FreeLibrary(hMole);hMole=IntPtr.Zero;farProc=IntPtr.Zero;}
⑸ c語言中怎麼調用函數謝謝
C語言中,卜銷函數調用的一般形式為:
函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
#include<stdio.h>
intfun(intx,inty);//函數聲明,如果函數寫在被調用轎弊晌處之前,可以不用聲明
voidmain()
{
inta=1,b=2,c;
c=fun(a,b);//函數的調用,調用自定義函數fun,其中a,b為實際參數,傳遞給被調用函數的輸入值
}
//自定義函數fun
intfun(intx,inty)//函數首部
{//{}中的語言為函數體
returnx>y?x:y;//返回x和y中閉鋒較大的一個數
}
C語言中不允許作嵌套的函數定義。因此各函數之間是平行的,不存在上一級函數和下一級函數的問題。但是C語言允許在一個函數的定義中出現對另一個函數的調用。
這樣就出現了函數的嵌套調用。即在被調函數中又調用其它函數。這與其它語言的子程序嵌套的情形是類似的。其關系可表示如圖。
圖表示了兩層嵌套的情形。其執行過程是:執行main函數中調用a函數的語句時,即轉去執行a函數,在a函數中調用b 函數時,又轉去執行b函數,b函數執行完畢返回a函數的斷點繼續執行,a函數執行完畢返回main函數的斷點繼續執行。
⑹ C語言中怎樣調用函數(舉個例子)
C語言中調用函數的方法及步驟:
工具/原料:C語言
1、首先需要輸洞氏入想要調用的函數。
⑺ 在R軟體中的FD包都包含哪些函數怎麼用
1、通過選擇菜單:
程序包->安裝程序包->在彈出的對話框中,選擇你要安裝的包,然後確定。
2、使用命令
install.packages(package_name,dir)
package_name:是指定要安裝的包名,請注意大小寫。
dir:包安裝的路徑。默認情況下是安裝在..\library 文件夾中的。可以通過本參數來進行修改,來選擇安裝的文件夾。
3、本地來安裝
如果你已經下載的相應的包的壓縮文件,則可以在本地來進行安裝。請注意在windows、unix、macOS操作系統下安裝文件的後綴名是不一樣的:
1)linux環境編譯運行:tar.gz文件
2)windows 環境編譯運行 :.zip文件
3)MacOSg環境編譯運行:.tgz文件
註:包安裝好後,並不可以直接使用,如果在使用包中相關的函數,必須每次使用前包載入到內存中。通過library(package_name)來完成。 包安裝後,如果要使用包的功能。必須先把包載入到內存中(默認情況下,R啟動後默認載入基本包),載入包命令:
Library(「包名」)
Require(「包名」) 1、查看包幫忙
library(help=package_name)
主要內容包括:例如:包名、作者、版本、更新時間、功能描述、開源協議、存儲位置、主要的函數
help(package = package_name)
⑻ 如何調用jar包里的main函數
在程序打包的時候可以設游仿譽置java包的啟動類也就是main方法 。設計好後通神段過java 命令啟動jar包即可執行大腔main方法
⑼ java類文件的執行順序,是先執行jar里的main方法,還是先執行自己寫的類
java 里的main相當於大門,如果你沒有從門里進去,怎麼去做其他的亮宴呢。直接在類裡面寫模橘一個main方法呢。public static void main(String[] agre){
實例敬碼銀化對象呢,
}
⑽ C語言中程序是怎麼執行的不是執行主函數里的嗎如果主函數不調用子函數,子函數也能執行嗎
單答悶片機中的中斷程序並不用中主程序中被調用,只要主程序中設好中斷允許。如外部中斷,主程序中設有總中斷和外部中斷開啟,單片機中的禪舉攜into埠給一個低電位,就運賀伏行中斷程序。這和c語言有一點出入