keil c51函數(shù)指針_第1頁
keil c51函數(shù)指針_第2頁
keil c51函數(shù)指針_第3頁
keil c51函數(shù)指針_第4頁
keil c51函數(shù)指針_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Keil C51 中的函數(shù)指針和再入函數(shù),函數(shù)指針與overlay=調(diào)用樹的保存   C51不把函數(shù)參數(shù)壓棧(除非使用再入函數(shù))。函數(shù)參數(shù)和全局變量被存入寄存器或固定的存儲空間。這樣阻止函數(shù)的再入。例如,一個(gè)函數(shù)調(diào)用它自己,它將覆蓋它自己的參數(shù)或存儲空間。函數(shù)的再入問題通過關(guān)鍵字“reentrant”來解決。函數(shù)指針的非再入函數(shù)的副作用,在執(zhí)行中出現(xiàn)問題。MAIN函數(shù)調(diào)用FUNC和FUNC_CALLER(根據(jù)調(diào)用樹)。用函數(shù)的指針來傳遞參數(shù),調(diào)用樹往往會出錯(cuò)。=轉(zhuǎn)       這篇文章是由Keil C51

2、 的英文文檔翻譯過來的,很多語句都是根據(jù)自己的理解翻譯的,肯定還有許多地方需要推敲。希望讀者能吸取到有用的部分,不要被誤解了,自己多理解。 Overlay修改用于數(shù)據(jù)覆蓋的調(diào)用樹。如果在用戶程序里使用了函數(shù)指針,或者使用了像實(shí)時(shí)操作系統(tǒng)中調(diào)度器那樣的跳轉(zhuǎn)(k 指的是指針方式的調(diào)用嗎?),那么,修改程序調(diào)用樹將是很有必要的。混合編程:函數(shù)名                     

3、0; 符號名          解釋viod func(void              FUNC            無參數(shù)傳遞,或不含寄存器參數(shù)的函數(shù)名不作改變        

4、60;                                    轉(zhuǎn)入目標(biāo)文件中,名字只是簡單地轉(zhuǎn)為大寫形式viod func(char        

5、60;     _FUNC       帶寄存器參數(shù)的函數(shù)名加入“_”字符前綴,它表明                                  

6、60;      這類函數(shù)包含寄存器內(nèi)的參數(shù)傳遞viod func(viod reentrant    _?FUNC          “_?”表示可重入,它表明該行數(shù)包含棧內(nèi)的參數(shù)傳遞。=將下面這篇的難點(diǎn)內(nèi)容提到前面使用函數(shù)指針的附加說明   如果你在C51中使用函數(shù)指針編程,有幾個(gè)附加的說明你必須注意。參數(shù)列表的限制   通過函數(shù)指針傳遞參數(shù)給函數(shù)必須把所有的參數(shù)存入寄存器。在大部分

7、情況下,3個(gè)參數(shù)能夠自動通過寄存器傳遞。在C51的用戶手冊中能找到傳遞參數(shù)進(jìn)入寄存器的運(yùn)算法則。但是并不保證,任何的3個(gè)數(shù)據(jù)類型可以傳遞。  因?yàn)镃51在寄存器中傳遞3個(gè)參數(shù),用于傳遞參數(shù)的存儲空間是不被分配的,除非函數(shù)指向一個(gè)要求更多參數(shù)的函數(shù)。如果在那樣的情況下,可以把參數(shù)混入一個(gè)結(jié)構(gòu)體中,然后通過一個(gè)結(jié)構(gòu)體指針傳遞參數(shù)。如果這樣不可接受,你可以使用再入函數(shù)(看下面)。  調(diào)用樹的保存   C51不把函數(shù)參數(shù)壓棧(除非使用再入函數(shù))。函數(shù)參數(shù)和全局變量被存入寄存器或固定的存儲空間。這樣阻止函數(shù)的再入。例如,一個(gè)函數(shù)調(diào)用它自己,它將覆蓋它自己的參數(shù)或存

8、儲空間。函數(shù)的再入問題通過關(guān)鍵字“reentrant”來解決。函數(shù)指針的非再入函數(shù)的副作用,在執(zhí)行中出現(xiàn)問題。   為了保護(hù)盡量多的數(shù)據(jù)空間,連接器執(zhí)行調(diào)用樹的性能分析,決定一些存儲空間被安全的覆蓋。例如,如果你的應(yīng)用中包含main 函數(shù),函數(shù)a,函數(shù)b,函數(shù)c,并且main函數(shù)調(diào)用a,b,c,但是a,b,c之間沒有互相調(diào)用。在你應(yīng)用中的調(diào)用樹見出現(xiàn)如下:MAIN    + A    + B    + C這樣A,B,C的存儲空間可以被安全的覆蓋。 當(dāng)調(diào)用樹不能正確的建立,函數(shù)

9、指針將帶來問題。因?yàn)檫B接器不能決定函數(shù)之間的引用。在這個(gè)問題上,沒有自動的解決方法。 下面兩個(gè)源文件將解答這個(gè)問題,使問題容易明白。第一個(gè)源文件,包括一個(gè)函數(shù),它通過一個(gè)函數(shù)指針(fptr)調(diào)用另一個(gè)函數(shù)。 FPCALLER.C      / 第一個(gè)源文件FPCALLER.C  (文件名 void  func_caller(long (code *fptr (unsigned int     / (函數(shù)名   

10、60;    unsigned char i;       for(i=0;i<10;i+                (*ftpr(i;         第二個(gè)源文件FPMAIN.C,包含C主函數(shù)和被func_caller調(diào)用的函數(shù)func。    

11、   注意main函數(shù)調(diào)用func_caller,把func的地址作為參數(shù)傳遞給func_caller。 FPMAIN.C      / 第二個(gè)源文件FPMAIN.C (文件名extern  void func_caller (long (code * (unsigned int;int  func (unsigned int count      /  (函數(shù)名     long j; 

12、;    long k;     k = 0;     for (j = 0; j < count; j+        k += j;    return (k;/   -void main (voidfunc_caller (func;while (1 ; 上面的兩個(gè)的源文件編譯和鏈接都沒有錯(cuò)誤。通過連接器,調(diào)用樹的映射文件如下:  SEGMENT

13、                                              DATA_GROUP  +-> CALLED SEG

14、MENT                     START    LENGTH-?C_C51STARTUP                      

15、0;               -    -  +-> ?PR?MAIN?FPMAIN ?PR?MAIN?FPMAIN                       

16、;             -    -  +-> ?PR?_FUNC?FPMAIN  +-> ?PR?_FUNC_CALLER?FPCALLER ?PR?_FUNC?FPMAIN                    

17、;        0008H    000AH?PR?_FUNC_CALLER?FPCALLER       0008H    0003H  在這個(gè)簡單的例子中,許多信息可以從調(diào)用樹里挖掘出來。?C_C51STARTUP段調(diào)用main函數(shù)的?PR?MAIN?FPMAIN,段名各部分解析:PR是代碼存儲區(qū),MAIN是函數(shù)名,F(xiàn)PMAIN是定義函數(shù)所在的源文件名。   

18、 MAIN函數(shù)調(diào)用FUNC和FUNC_CALLER(根據(jù)調(diào)用樹)。注意這是錯(cuò)誤的。MAIN函數(shù)沒有調(diào)用FUNC函數(shù),但是它傳遞FUNC函數(shù)的地址給FUNC_CALLER函數(shù)。同時(shí)注意,根據(jù)調(diào)用樹FUNC_CALLER沒有調(diào)用FUNC。這是因?yàn)镕UNC_CALLER是通過函數(shù)指針間接調(diào)用FUNC。  FPMAIN文件中的FUNC函數(shù)使用從0008H開始,長000AH字節(jié)的數(shù)據(jù)。FPCALLER文件中的FUNC_CALLER函數(shù)也使用從0008H開始,長0003H字節(jié)的數(shù)據(jù)。這是重要的。  FUNC_CALLER函數(shù)使用的存儲區(qū)從0008H開始,F(xiàn)UNC函數(shù)使用的存儲

19、區(qū)也是從0008H開始。因?yàn)镕UNC_CALLER函數(shù)調(diào)用FUNC函數(shù),又因?yàn)閮蓚€(gè)函數(shù)使用相同的存儲區(qū),這樣就產(chǎn)生了問題。當(dāng)FUNC函數(shù)被FUNC_CALLER函數(shù)調(diào)用時(shí),存儲區(qū)將被FUNC_CALLER破壞。這個(gè)問題是怎樣產(chǎn)生的?是由Keil 51編譯器產(chǎn)生還是由連接器產(chǎn)生?   這個(gè)問題的原因是函數(shù)指針。當(dāng)你使用函數(shù)指針時(shí),你將總是遇到這樣的問題。幸運(yùn)的是,他們是容易被修改的。“OVERLAY”指令讓你指定在調(diào)用樹中,函數(shù)與其他函數(shù)是怎樣連接的。   為了修正上面顯示的調(diào)用樹,F(xiàn)UNC函數(shù)必須從MAIN函數(shù)中刪除,同時(shí)FUNC函數(shù)必須插入到FUNC_

20、CALLER函數(shù)中。下面用“OVERLAY”指令修改后如下:  OVERLAY (?PR?MAIN?FPMAIN ?PR?_FUNC?FPMAIN,  ?PR?_FUNC_CALLER?FPCALLER ! ?PR?_FUNC?FPMAIN為了刪除或插入相關(guān)的進(jìn)入調(diào)用樹,指定第一調(diào)用和第二調(diào)用。“”符號用于刪除相關(guān)的函數(shù),“!”用于插入一個(gè)外部函數(shù)。例如?PR?MAIN?FPMAIN ?PR?_FUNC?FPMAIN,意義是從MAIN函數(shù)中刪除FUNC函數(shù)的調(diào)用。  經(jīng)過調(diào)整連接命令,包括用“OVERLAY”指令修正調(diào)用樹,調(diào)整后的映射文件如下:  SE

21、GMENT                             DATA_GROUP  +-> CALLED SEGMENT               

22、60;START    LENGTH-?C_C51STARTUP                     -    -  +-> ?PR?MAIN?FPMAIN?PR?MAIN?FPMAIN           &

23、#160;       -    -  +-> ?PR?_FUNC_CALLER?FPCALLER?PR?_FUNC_CALLER?FPCALLER         0008H    0003H    / 模塊的地址  +-> ?PR?_FUNC?FPMAIN?PR?_FUNC?FPMAIN    

24、;              000BH    000AH 修正后的調(diào)用樹中,F(xiàn)UNC_CALLER函數(shù)和FUNC函數(shù)使用獨(dú)立存儲空間。 函數(shù)指針列表  下面是一個(gè)典型的函數(shù)指針列表的定義:long (code *fp_tab (void = func1, func2, func3 ; 如果你的MAIN函數(shù)中通過fp_tab調(diào)用歌函數(shù),連接映射文件出現(xiàn)如下:  SEGMENT 

25、                         DATA_GROUP  +-> CALLED SEGMENT          START    LENGTH-?C_C51STARTUP   

26、               -    -  +-> ?PR?MAIN?FPT_MAIN  +-> ?C_INITSEG?PR?MAIN?FPT_MAIN              0008H    0001H?C_INITSEG

27、0;                    -    -  +-> ?PR?FUNC1?FP_TAB  +-> ?PR?FUNC2?FP_TAB  +-> ?PR?FUNC3?FP_TAB?PR?FUNC1?FP_TAB         &#

28、160;     0008H    0008H?PR?FUNC2?FP_TAB               0008H    0008H?PR?FUNC3?FP_TAB               0008H 

29、   0008H 三個(gè)函數(shù)通過列表被調(diào)用,F(xiàn)UNC1,F(xiàn)UNC2 和FUNC3被C_INITSEG調(diào)用。但是這是錯(cuò)誤的,C_INITSEG按照常規(guī)的方式在程序中初始化。這些函數(shù)被引入初始化代碼中,因?yàn)楹瘮?shù)指針列表被初始化成這些函數(shù)的地址值。   注意這些變量(FUNC1,F(xiàn)UNC2 和FUNC13)和MAIN函數(shù)的起始地址都是0008H。這樣不能正常工作,因?yàn)镸AIN函數(shù)調(diào)用FUNC1,F(xiàn)UNC2 和FUNC3(通過函數(shù)指針類表)。   C51編譯器和BL51連接器聯(lián)合工作,當(dāng)使用函數(shù)指針列表時(shí),使得函數(shù)變量空間覆蓋很容易。

30、但是,你必須合理的聲明指針列表。如果你這樣做了,就可以避免使用“OVERLAY”指令。下面的函數(shù)指針列表的定義,C51和BL51可以自動處理:  code long (code *fp_tab (void = func1, func2, func3 ;注意唯一不同的是存儲列表在CODE空間。現(xiàn)在,連接映射文件如下:  SEGMENT                    

31、60;     DATA_GROUP  +-> CALLED SEGMENT          START    LENGTH-?C_C51STARTUP                  -    -  +-&g

32、t; ?PR?MAIN?FPT_MAIN?PR?MAIN?FPT_MAIN              0008H    0001H  +-> ?CO?FP_TAB?CO?FP_TAB                    

33、-    -  +-> ?PR?FUNC1?FP_TAB  +-> ?PR?FUNC2?FP_TAB  +-> ?PR?FUNC3?FP_TAB?PR?FUNC1?FP_TAB               0009H    0008H?PR?FUNC2?FP_TAB       &

34、#160;       0009H    0008H?PR?FUNC3?FP_TAB               0009H    0008H  現(xiàn)在,初始化代碼中沒有引入FUNC1,F(xiàn)UNC2 和FUNC3。但是,MAIN函數(shù)中引入一個(gè)常數(shù)段FP_TAB。這是一個(gè)函數(shù)指針列表。因?yàn)楹瘮?shù)指針列表引入了FUNC1,F(xiàn)UNC2 和F

35、UNC3,所以調(diào)用樹是正確的。  只要把函數(shù)指針列表放在一個(gè)獨(dú)立的源文件中,在調(diào)用樹中,C51和BL51就能正確的連接。 函數(shù)指針的建議和技巧  有些函數(shù)指針的應(yīng)用技巧。使用指定空間的指針  把函數(shù)指針從一個(gè)普通的指針變成一個(gè)指定空間的指針。用一個(gè)字節(jié)保存指針。因?yàn)楹瘮?shù)屬于CODE存儲區(qū)(在8051里),一個(gè)字節(jié)可以用來保存聲明的函數(shù)指針作為CODE指針。例如:  void (code *function_ptr (void = another_function;如果你選擇在你的函數(shù)指針聲明中包含code關(guān)鍵字,就可以在任何地方使用它

36、。如果你聲明一個(gè)函數(shù),它接收一個(gè)3字節(jié)的普通指針,通過指定空間傳遞,2字節(jié)函數(shù)指針,壞事將要產(chǎn)生。 再入函數(shù)和指針  Keil C51 為函數(shù)的再入提供關(guān)鍵字“reentrant”。再入函數(shù)的參數(shù)通過模擬棧來傳遞。模擬棧對于small存儲模式位于IDATA,對于compact存儲模式位于PDATA,對于large存儲模式位于XDATA。如果你使用再入函數(shù),在STARTUP.A51中你必須初始化再入棧的指針。參考下面的啟動代碼:  ;-;  Reentrant Stack Initilization;  The following EQU sta

37、tements define the stack pointer for reentrant;  functions and initialized it:;  Stack Space for reentrant functions in the SMALL model.IBPSTACK      EQU     0         ; set to 1 if small reentrant is used

38、.IBPSTACKTOP   EQU     0FFH+1    ; set top of stack to highest location+1.;  Stack Space for reentrant functions in the LARGE model.XBPSTACK      EQU     0         ;

39、 set to 1 if large reentrant is used.XBPSTACKTOP   EQU     0FFFFH+1  ; set top of stack to highest location+1.;  Stack Space for reentrant functions in the COMPACT model.PBPSTACK      EQU     0   

40、0;     ; set to 1 if compact reentrant is used.PBPSTACKTOP   EQU     0FFFFH+1  ; set top of stack to highest location+1.;-   你必須設(shè)置你使用的存儲模式的堆棧和設(shè)置棧頂。當(dāng)有入棧時(shí),再入函數(shù)的棧指針減少(向下移動)。為了保護(hù)內(nèi)部的數(shù)據(jù)區(qū),有一個(gè)技巧就是把所有的再入函數(shù)放在一個(gè)獨(dú)立的存儲模式,像large或compact。  用reen

41、trant聲明再入函數(shù)。void reentrant_func (long arg1, long arg2, long arg3 reentrant   用large和reentrant聲明一個(gè)large模式的再入函數(shù)。void reentrant_func (long arg1, long arg2, long arg3 large reentrant 聲明一個(gè)再入函數(shù)的函數(shù)指針,必須使用reentrant關(guān)鍵字。 void (*rfunc_ptr (long, long, long reentrant = reentrant_func;再入函數(shù)的函數(shù)

42、指針和非再入函數(shù)的函數(shù)指針沒有許多不同。當(dāng)使用再入函數(shù)指針時(shí),會生成更多的代碼,因?yàn)閰?shù)被壓入模擬棧。然而,沒有特殊的連接要求和不需要打亂“OVERLAY”指令。  如果通過間接調(diào)用傳遞超過3個(gè)參數(shù)給函數(shù),需要再入函數(shù)指針。總結(jié)  函數(shù)指針是非常有用的,并不是很困難的,如果你注意連接調(diào)用樹,保證用“OVERLAY”指令修正一些沖突。=概述函數(shù)指針是C語言中幾個(gè)難點(diǎn)之一。由于8051的C編譯器的獨(dú)特要求,函數(shù)指針和再入函數(shù)有更多的挑戰(zhàn)需要克服。主要由于函數(shù)變量的傳遞。典型的(絕大部分8051芯片)函數(shù)變量通過堆棧的入棧和出棧命令來傳遞。因?yàn)?051只有有限的堆棧空間(128字

43、節(jié)或更少的64字節(jié)),函數(shù)變量必須通過不同的方式進(jìn)行傳遞。8051的PL/M-51編譯器,介紹在固定的存儲空間span存儲變量的方式。當(dāng)使用連接器時(shí),程序建立一個(gè)調(diào)用樹,計(jì)算出函數(shù)變量的互斥空間,然后覆蓋它們。這就是連接器的“OVERLAY”指令。因?yàn)镻L/M-51不支持函數(shù)指針,所以不能實(shí)現(xiàn)間接函數(shù)調(diào)用。然而,C語言中存在這樣的問題。連接器知道哪塊空間用于存儲間接函數(shù)的變量。怎樣間接加入函數(shù)進(jìn)入調(diào)用樹?本文解釋在C51編程中,怎樣有效使用函數(shù)指針。特別地,討論如下幾個(gè)話題:分配常量地址給一個(gè)指針;定義函數(shù)指針;C51中函數(shù)指針問題;使用OVERLAY指令確定調(diào)用樹;再入函數(shù)的指針; 

44、;固定地址的指針   你很容易的給函數(shù)指針分配一個(gè)數(shù)字地址。有許多原因需要這樣做。例如,你需要復(fù)位目標(biāo)。你可以設(shè)置函數(shù)指針為0000H去實(shí)現(xiàn)。   你可以使用標(biāo)準(zhǔn)C語言的類型映射特點(diǎn),映射0X0000指針指向地址0的函數(shù)。例如,當(dāng)你編譯如下C代碼.   (void (code *(void)0x0000) ();   編譯器產(chǎn)生如下如下代碼:               

45、60; ;FUNCTION main (BEGIN                                            ;SOURCE   L

46、INE  #30000  120000    LCALL   00H                                       &#

47、160;  SOURCE   LINE  #40003  22        RET                 FUNCTION main (END   這正是我們期望的:LCALL  0把一個(gè)數(shù)字常量映射成一個(gè)函數(shù)指針是一件很復(fù)雜的事情。下面關(guān)于上面的函數(shù)調(diào)用的各部分的描述,將幫助

48、你怎樣更好的使用它們。  在上面的函數(shù)調(diào)用中,(void ( * (void)是數(shù)據(jù)類型:一個(gè)不帶參數(shù)且返回void的函數(shù)指針。  0x0000是一個(gè)映射地址。經(jīng)過類型映射,函數(shù)指針指向地址0x0000。注意我們把一個(gè)圓括號放在數(shù)據(jù)類型和0x0000后面。如果我們僅僅想映射0x0000成為函數(shù)指針,這是不必要的。然而,因?yàn)槲覀儗⒁眠@個(gè)函數(shù),這些圓括號是必要的。   映射一個(gè)數(shù)值常量成為指針和通過指針調(diào)用函數(shù)是不同的。為了實(shí)現(xiàn)這個(gè),我們必須指定一個(gè)變量表。這就是為什么在此行的后面有一個(gè)()。   注意上面表達(dá)式中的所有圓括號都是必須的

49、。分組和優(yōu)先級是很重要的。   上面不帶參數(shù)的函數(shù)指針和帶參數(shù)的函數(shù)指針的唯一不同是數(shù)據(jù)類型和變量列表。例如,下面的函數(shù)調(diào)用.   (long (code * (int int int 0x8000)(1,2,3;聲明一個(gè)函數(shù),地址在0x8000,接收3個(gè)int型參數(shù),返回long型結(jié)果。 不帶參數(shù)的函數(shù)指針   指向函數(shù)的函數(shù)指針是可變的。函數(shù)的地址是一個(gè)可變的數(shù)值。例如,下面的函數(shù)指針的聲明.   void (*function_ptr (void;是一個(gè)調(diào)用 function_ptr的指針。使用下面

50、的代碼調(diào)用function_ptr函數(shù)。   (*function_ptr (;因?yàn)楹瘮?shù)沒有參數(shù)傳送,所以參數(shù)列表是空的。當(dāng)定義變量的時(shí)候,函數(shù)指針可以被分配地址:void (*function_ptr (void = another_fuction;  或者在程序執(zhí)行過程中被分配,function_ptr = another_fuction;   注意,必須分配一個(gè)地址給函數(shù)指針。如果沒有分配,函數(shù)指針將有一個(gè)0值(如果你運(yùn)氣好),或者有一些你完全不知道的數(shù)值,依賴于你的數(shù)據(jù)存儲區(qū)的使用情況。當(dāng)你間接的調(diào)用一個(gè)函數(shù)通過函數(shù)指針,如果函數(shù)指針沒

51、有初始化,你的程序?qū)⑹腔靵y的。   為了聲明一個(gè)帶返回值的函數(shù)指針,在聲明過程中你必須指定返回值的數(shù)據(jù)類型。例如,下面的聲明改變了上面的函數(shù)指針的聲明,返回一個(gè)float 數(shù)據(jù)。float  (*function_ptr (void = another_fuction;   帶參數(shù)的函數(shù)指針  帶參數(shù)的函數(shù)指針與不帶參數(shù)的函數(shù)指針是相似的。例如:  void (*function_ptr (int, long,char; 一個(gè)函數(shù)指針,帶一個(gè)int參數(shù),帶一個(gè)long參數(shù),帶一個(gè)char參數(shù)。使用下面的代碼調(diào)用函數(shù)。

52、0; (*function_ptr (12, 34L,A;注意,函數(shù)指針僅僅可以指向小于等于3個(gè)參數(shù)的函數(shù)。這是因?yàn)椋g接調(diào)用函數(shù)時(shí),參數(shù)必須保存在寄存器中。關(guān)于超過3個(gè)參數(shù)的函數(shù)指針的信息,在再入函數(shù)中介紹。 =標(biāo)  題: keil利用函數(shù)指針調(diào)用超過3個(gè)參數(shù)的函數(shù)問題 發(fā)信站: 水木社區(qū) (Thu Jun 23 22:37:58 2011, 站內(nèi) 我想利用函數(shù)指針實(shí)現(xiàn)對超過3個(gè)參數(shù)的函數(shù)進(jìn)行調(diào)用,但編譯總是出現(xiàn)錯(cuò)誤,代碼如下: void func(int a,i

53、nt b,int c,int d         printf("in func:%d,%d,%d,%dn",a,b,c,d; void main(void         void (* pf(int arg1, int arg2, int arg3,int arg4;         pf = (void *func;         pf(10,11,12,14; 但編譯總是出現(xiàn)如下錯(cuò)誤: error C212: indirect call: parameters do not fit within registers 查資料發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論