fortran与c语言接口参数传递混合编程0001_第1页
fortran与c语言接口参数传递混合编程0001_第2页
fortran与c语言接口参数传递混合编程0001_第3页
fortran与c语言接口参数传递混合编程0001_第4页
fortran与c语言接口参数传递混合编程0001_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Sun Studio 12: Fortran 编程指南Previous :第10章并行化第 11 章 C-Fortran接口本章论述Fortran与C的互操作性方面的问题,内容仅适用于 Sun Studio Fortran 95和C编译器的特定情况11.9 Fortran 2003 与C的互操作性 简要说明了 Fortran 2003 标准第15部分中提 到的C绑定功能。(此标准可以从国际Fortran标准 Web站点获得)。Fortran 95编译器实现了标准中所述的这些功能。如不特别注明,32位x86处理器视为与 32位SPARC处理器等同。对于 64位 x86处理器和64位SPARC 处

2、理器也是如此,只是 x86系统未定义 REAL*16和 COMPLEX*32 数据类型,这些数据类型只能用于 SPARC。11.1兼容性问题大多数C-Fortran接口必须在以下这些方面全部保持一致:? 函数和子例程的定义及调用? 数据类型的兼容性? 参数传递(按引用或按值)? 参数的顺序? 过程名(大写、小写或带有结尾下划线(_)? 向链接程序传递正确的库引用某些C-Fortran接口还必须符合:? 数组索引及顺序? 文件描述符和stdio? 文件权限11.1.1函数还是子例程?函数一词在C和Fortran中有不同的含义。根据具体情况做出选择很重要:在C中,所有的子程序都是函数;但 void

3、函数不会返回值。 在Fortran中,函数会传递一个返回值,但子例程一般不传递返回值。当Fortran例程调用C函数时:?如果被调用的C函数返回一个值,则将其作为函数从Fortran中调用?如果被调用的 C函数不返回值,则将其作为子例程调用。当C函数调用Fortran子程序时:如果被调用的Fortran子程序是一个函数,则将其作为一个返回兼容数据类型 的函数从C中调用。如果被调用的Fortran子程序是一个子例程,则将其作为一个返回int (与 Fortran INTEGER*4兼容)或void 值的函数从 C中调用。如果 Fortran子 例程使用交替返回,则会返回一个值,这种情况下它是RE

4、TURN语句中的表达式的值。如果 RETURN语句中没有出现表达式,但在SUBROUTINE语句中声明了交替返回,则会返回零。11.1.2数据类型的兼容性表11 总结了 Fortran 95 (与C比较)数据类型的数据大小和缺省对齐。该表假设 未应用影响对齐或提升缺省数据大小的编译选项。请注意以下事项:? C数据类型int 、long int 和long 在32位环境下是等同的(4字节)。 但是,在64位环境下long和指针为8字节。这称为LP64数据模型。? 在64位SPARC 环境下,当用任意-m64选项进行编译时,REAL*16和COMPLEX*32与16字节边界对齐。? 标有4/8的对

5、齐表示缺省情况下与 8字节边界对齐,但在COMMON 块中与 4字节边界对齐。COMMON 中的最大缺省对齐为 4字节。当用-m64选项进 行编译时,4/8/16表示与16字节边界对齐。? REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、COMPLEX*32 只 能用于SPARC平台。? 数组和结构的元素及字段必须兼容。? 不能按值传递数组、字符串或结构。? 可以在调用点使用 %VAL(arg),按值将参数从 Fortran 95例程传递到 C例 程。假如Fortran例程具有一个显式接口块, 该接口块用VALUE属性声明了伪 参数,则可以按值将参数从 C传递到F

6、ortran 95。? 数值序列类型的组件的对齐方式与通用块的对齐方式相同,也会受到-aligncommon选项的影响。数值序列类型是这样一种序列类型:其中所有组件的类型为缺省整数、缺省实数、双精度实数、缺省复数或缺省逻辑,而不 是指针。? 在大多数情况下,非数值序列类型的数据类型组件以自然对齐的方式对齐,但QUAD 变量除外。对于四精度变量,32位SPARC 平台和 64位SPARC 平 台之间的对齐方式不同。? 在所有平台上,用 BIND(C)属性定义的VAX结构和数据类型的组件始终与C结构具有相同的对齐方式。表11 数据大小与对齐一(以字节表示)按引用传递(f95和cc )Fortran

7、 95数据类型C数据类型大 小对齐BYTE xchar x11rCHARACTERxun sig ned char x ;11CHARACTER (LEN= n)xunsigned char x n;n11COMPLEX xstruct float r,i;84x;COMPLEX(KIND=4) xstruct float r,i;84x;COMPLEX(KIND=8) xstruct double164/8COMPLEX (KIND=16)dr,di; x;324/8/16x (SPARC)struct long double, dr,di; x;DOUBLE COMPLEX xstruct

8、 double dr,164/8di; x;DOUBLE PRECISION xdouble x ;84REAL xfloat x ;44REAL (KIND=4) xfloat x ;44REAL (KIND=8) xdouble x ;84/8REAL (KIND=16)long double x ;164/8/16x (SPARC)1INTEGER xint x ;44INTEGER (KIND=1) xsig ned char x ;14Fortran 95数据类型C数据类型大 小对齐INTEGER (KIND=2) xshort x ;24INTEGER (KIND=4) xint

9、x ;44INTEGER (KIND=8) xlong long int x;841LOGICAL xint x ;44LOGICAL (KIND=1) xsig ned char x ;14LOGICAL (KIND=2) xshort x ;24LOGICAL (KIND=4) xint x ;44LOGICAL (KIND=8) xlong long int x;8411.1.3大小写敏感性C和Fortran在区分大小写方面采取截然相反的处理方法:? C区分大小写一大小写很重要。?Fortran在缺省情况下忽略大小写。f95缺省通过将子程序名转换成小写来忽略大小写。除了字符串常量以外,它

10、会将所有大写字母都转换成小写字母。对于大/小写问题,有两种常用解决方案:? 在C子程序中,使 C函数名全为小写。? 用-U选项编译Fortran程序,该选项会通知编译器保留函数/子程序名称的现有大/小写区别。只能米用这两种解决方案中的一种,不能同时米用。本章大多数示例的 C函数名均采用小写字母,并且 没有使用f95-U 编译器选项。11.1.4例程名中的下划线Fortran编译器通常会在入口点定义和调用中都出现的子程序名末尾追加一个下划线(_)。该惯例不同于具有相同的用户指定名称的C过程或外部变量。几乎所有Fortran库过程名都有两个前导下划线,以减少与用户指定的子例程名的冲突。对于下划线问

11、题,有三种常用解决方案:? 在C函数中,通过在函数名末尾追加下划线来更改该名称。? 使用BIND(C)属性声明来指明外部函数是C语言函数。? 使用f95 -ext_names选项编译对无下划线的外部名称的引用。只能使用上述解决方案中的一种。本章的示例都可以使用 BIND(C)属性声明来避免下划线。BIND(C)声明可从Fortran调用的C外部函数,以及可从 C中作为参数调用的 Fortran例程。Fortran 编译器在处理外部名称时通常不追加下划线。BIND(C)必须出现在每个包含这样的引用的子程序中。惯常用法是:FUNCTION ABCEXTERNAL XYZBIND(C) ABC, X

12、YZ在此处,用户不仅指定 XYZ是外部C函数,而且还指定 Fortran调用程序ABC应该 可以从C函数调用。如果使用 BIND(C) ,C函数不需要在函数名末尾追加下划线。11.1.5按引用或值传递参数通常,Fortran例程按引用传递参数。 在调用中,如果非标准函数 VAL()中包含一个 参数,则调用例程会按值传递该参数。Fortran 95按值传递参数的标准方法是通过VALUE属性和INTERFACE 块。请参见11.4按值传递数据参数。C通常按值传递参数。如果在参数前加上表示和”的符号(&), C会使用指针按引用传递参数。C总是按引用传递数组和字符串。11.1.6参数顺序除字符串参数之

13、外,Fortran和C均以相同的顺序传递参数。但对于每个字符型参数, Fortran例程都会传递一个附加参数,用以指定串长度。这些参数在C中是long int数量,按值进行传递。参数顺序为:? 与每个参数相应的地址(数据或函数)? 与每个字符参数对应的long int (字符串长度的完整列表位于其他参数的完 整列表之后)示例:Fortra n 代码片段:等价的C代码片段:CHARACTER*7 SINTEGER B(3)CALL SAM( S, B(2)char s7;int b3;sam( s, & b1, 7L );11.1.7数组索引和顺序Fortran与C的数组索引和顺序不同。11.1

14、.7.1数组索引C数组总是从0开始,而Fortran数组在缺省情况下是从1开始。有两种常用的索引处理方法。? 如上述示例所示,可以使用 Fortran缺省设置。此时,Fortran元素B(2)等 同于C元素b1。? 可以指定Fortran数组B以B(0)开始,如下所示:INTEGER B(0:2)这样,Fortran元素B(1)就等同于C元素b111.1.7.2数组顺序Fortran数组按列主顺序存储:A(3,2)A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2)C数组按行主顺序存储:A32A00 A01 A10 A11 A20 A21 这对于一维数组不存在任何

15、问题。但对于多维数组,应注意下标在所有引用和声明中是 如何出现和使用的一可能需要做些调整。例如,在C中进行部分矩阵操作,而后在 Fortran中完成余下部分,这样做可能会产 生混淆。最好是将整个数组传递给另一语言中的例程,然后在该例程中执行 所有矩阵操作,以避免在 C和Fortran中各执行部分操作的情况。11.1.8文件描述符和stdioFortran I/O 通道采用的是单元号。底层SunOS操作系统不处理单元号,而是处理文件描述符。Fortran运行时系统会不断变换,所以大多数Fortran程序没必要识别文件描述符。许多C程序都使用一组称为 标准I/O (即stdio )的子例程。有许多

16、 Fortran I/O 函 数也使用标准I/O,而后者又使用操作系统 I/O调用。下表列出了这些 I/O系统的某 些特性。表11 Fortran 与 C 之间的I/O 比较Fortra n单元标准I/O文件指针文件描述符文件打开为读写打开为读打开、为写打开、为 读与打开,或者为追加打开;请参见 open (2)为读打开、为写打开 或同时为读写打 开属性已格式化或未格式化始终未格式化,但可用格 式解释例程进行读或写始终未格式化I访问直接或顺序直接访问(如果物理文件 的表示是直接访问),但 总是可以按顺序读取直接访问(如果物理 文件的表示是直接 访问),但总是可以 按顺序读取1结构记录字节流字节

17、流I形式0-2147483647 间的任意非负整数指向用户地址空间中结构 的指针0-1023间的整数11.1.9库与使用f95 命令链接要链接正确的Fortran和C库,请使用f95命令调用链接程序示例1:用编译器进行链接:demo% cc -c someCrouti ne.cdemo% f95 theF95routi ne.f someCrout in e.o r = 32.;double complex zw - i = .007;w = (32., .007)z - r = 66.67;z = (66.67, 94.1)z - i = 94.1;returnend在64位 环境下,在寄存

18、器中返回 COMPLEX值11.3.3字符串由于没有标准接口,因此不推荐在C与Fortran例程间传递字符串。不过,请注意以下方面:? 所有C字符串均按引用传递。? Fortran调用会为参数列表中具有字符类型的每个参数传递一个附加参数。此额外参数给出串长度,它等同于按值传递的 C长整数。(这要依具体实现而定。) 额外的串长度参数出现在调用中的显式参数之后。下例展示了具有字符串参数的Fortra n调用及其等同的 C调用:表 11 -5 传递 CHARACTER 串rFortra n 调用:等价的C调用:厂CHARACTER*7 Schar s7;rFortra n 调用:等价的C调用:INT

19、EGER B(3)int b3;CALL CSTRNG( S, B(2)cstrng_( s, & b1, 7L );如果在被调用例程中不需要串长度,则可以忽略额外的参数。但要注意,Fortran不会自动以C期望的显式空字符来终结字符串。该终结符必须由调用程序添加。字符数组调用与单个字符变量调用看起来一样。会传递数组的起始地址,所使用的长度 是数组中单个元素的长度。11.3.4 一维数组在C中数组下标以0开始表11 -6传递一维数组Fortra n调用 CC 调用 Fortra nin teger i, Sumexter n void vecref_in teger a(9)(int, int

20、 * );exter nal FixVecint i, sum;call FixVec ( a, Sum )in t v9=.void fixvec_ (vecref_( v, &sum );in t v9, i nt *sum )subrouti ne VecRef( v,total)int i;in teger i, total, v(9)total = 0*sum 一 0;rFortra n调用 CC 调用 Fortra nfor ( i = 0;i x;v - x = v - y;SUBROUTINE FFLIP(P)STRUCTURE /POINT/REAL X,Y,ZEND STR

21、UCTURERECORD /POINT/ PREAL TrFortra n调用 CC 调用 Fortra n!v - y = t;T = P.Xv - z = -2.*(v- z);P.X = P.YP.Y = TP.Z = -2.*P.Z请注意,在所有平台上Fortran 77 (VAX)结构与C结构的对齐方式始终相同。但是,平台之间对齐方式会有所变化。表11 -9传递Fortran 95 派生类型rFortran 95 调用 CC 调用 Fortran 95TYPE poi ntstruct point SEQUENCEfloat x,y,z;REAL : x, y, z;END TYPE

22、 poi ntexter n void fflip_ (TYPE (poi nt) basestruct point *);EXTERNAL flipstruct point d;CALL flip( base)struct point *ptx = &d;struct point fflip_ (ptx);float x,y,z;;SUBROUTINE FFLIP( P )void flip_( struct pointTYPE POINT*v )SEQUENCE x;TYPE (POINT) Pv - x = v - y;REAL : Tv - y = t;T = P%Xv- z = -2

23、.*(v- z);P%X = P%YP%Y = TP%Z = -2.*P%Z请注意,Fortran 95标准要求派生类型定义中有 SEQUENCE语句,以确保编译器保持 存储序列的顺序。在所有平台上,数值序列类型的组件缺省情况下与字(4字节)边界对齐。这与x86平台上C结构的对齐方式相匹配,但是不同于SPARC平台上C结构的对齐方式。使用-aligncommon选项可更改数值序列类型的对齐方式,以便与C结构相匹配。使用-aligncommon=8匹配 32 位 SPARC C 结构,使用-aligncommon=16匹配 64 位 SPARC。未使用SEQUENCE显式声明的派生类型与 SPA

24、RC平台上的C结构对齐方式相同, 但与x86平台上的对齐方式不同。这种对齐方式不随编译器选项而改变。11.3.7指针由于Fortran例程按引用传递参数,因此可将FORTRAN 77 (Cray)指针作为指针的指针传递给C例程。表 11 -10 传递 FORTRAN 77 (Cray) 指针1Fortra n调用 CC 调用 Fortra nREAL XPOINTER (P2X, X) EXTERNAL PASSP2X = MALLOC(4)X = 0.exter n void fpass_( float* );float *p2x;rFortra n调用 CC 调用 Fortra nCALL

25、 PASS(P2X)fpass_(&p2x);void pass_(p)SUBROUTINE FPASS (P2X) float *p;REAL XPOINTER (P2X, X)*p = 100.1;X = 0.C指针与Fortran 95标量指针兼容,但与 数组指针不兼容。Fortran 95 用标量指针调用CFortran 95 例程:INTERFACESUBROUTINE PASS(P) REAL, POINTER : PEND SUBROUTINEEND INTERFACEREAL, POINTER : P2XALLOCATE (P2X)P2X = 0CALL PASS(P2X)PR

26、INT*, P2XENDFortran 95用标量指针调用CC例程:void pass_(p); float *p;*p = 100.1;Cray与Fortran 95指针间的主要区别是 Cray指针的目标始终是已命名的。在许多 上下文中,声明 Fortran 95指针会自动标识其目标。另外,被调用C例程还需要显式 INTERFACE 块。要将Fortran 95指针传递给数组或数组段,需要特定的INTERFACE块,如下例所示:Fortran 95 例程:INTERFACESUBROUTINE S(P)in teger P(*)END SUBROUTINE SEND INTERFACEin

27、teger, target: A(0:9)in teger, poin ter : P(:)P = A(0:9:2) ! poin ter selects every other eleme nt of A call S(P)C例程:void s_(i nt p)/#i nclude int main (i nt ac, char 请注意,如果要以不同的数据类型作为实际参数来调用C例程,应该在接口块中包含!$PRAGMA IGNORE_TKR I,以防止编译器在实际参数和伪参数之间要求类型、 类别和等级匹配。对于传统Fortran 77,按值调用仅对简单数据可用,并且只能为调用C例程的Fort

28、ran77例程所用。无法做到让C例程调用Fortran 77例程并按值传递参数。数组、字符串或结构最好是按引用传递。要将值从Fortran 77例程传递到C例程,请使用非标准Fortran函数%VAL(arg)作为调用中的一个参数。在以下示例中,Fortran 77例程按值传递x,按引用传递y。C例程同时增加了 x和 y,但只有y发生了改变。Fortra n调用 CFortra n 例程: change middle element */ p2 = 444;请注意,由于C例程S不是Fortran 95例程,因此不能在接口块中将其定义成假定 的形状(integerP(:)。如果C例程需要知道数组

29、的实际大小,必须将其作为参数传递给C例程。另请注意,C与Fortran间的下标编排不同,C数组以下标0开始。11.4按值传递数据参数从C中调用时,Fortran 95程序应在伪参数中使用 VALUE属性,并且应为从 Fortran 95中调用的C例程提供一个INTERFACE块。表11 -11在C与Fortran 95之间传递简单数据元素Fortran 95 调用 CC 调用 Fortran 95PROGRAM callcINTERFACEINTEGER FUNCTION crtn (I)BIND(C) crtnINTEGER, VALUE,INTENT(IN) : IEND FUNCTION

30、 crtnEND INTERFACEM = 20MM = crtn (M)WRITE (*,*) M, MMEND PROGRAMFortran 95 调用 CC 调用 Fortran 95int crtn (i nt x)int y;prin tf(%d input n, x);y = x + 1;prin tf(%d returni ngn,y);return(y);Results:20 in put21 retur ning20 21Fortra n调用 CREAL x, yx = 1.y = 0.PRINT *, x,yCALL value( %VAL(x), y)PRINT *, x

31、,yENDC例程:void value_( float x, float *y) printf(%f, %fn,x,*y);x = x + 1.;*y = *y + 1.;prin tf(%f, %fn,x,*y);编译并运行会产生以下输出结果:1.00000 0.x and y from Fortra n1.000000, 0.000000x and y from C2.000000, 1.000000new x and y from C1.00000 1.00000new x and y from Fortra n11.5返回值的函数返回 BYTE、INTEGER、REAL、LOGICAL

32、、DOUBLE PRECISION 或 REAL*16 类 型值的Fortran函数与返回兼容类型的 C函数是等同的(请参见 表11 -1 )。字符型函数的返回值存在两个额外参数,复数型函数的返回值存在一个额外参数11.5.1返回简单数据类型下例返回一个 REAL 或 float 值。BYTE、INTEGER、LOGICAL、DOUBLEPRECISION 和 REAL*16 的处理方式类似:表11 -2返回 REAL 或Float值的函数Fortra n调用 CC 调用 Fortra n1real ADD1, R, Sfloat r, s;external ADD1exter n float

33、 fadd1_();R = 8.0r = 8.0;S = ADD1( R )s = fadd1_( &r );float add1_( pf )real fun cti on fadd1 (p)float *pf;real pfadd1 = p + 1.0float f ;returnf = *pf;endf+;return ( f );11.5.2 返回 COMPLEX 数据COMPLEX数据的互操作性情况在 SPARC 32位和64位实现之间有所不同11.5.2.1 32 位平台在32位平台上,返回 COMPLEX 或DOUBLE COMPLEX 的Fortran函数等同于 具有一个指向内

34、存中返回值的附加第一参数的C函数。Fortran函数及其相应的 C函数的一般样式如下:Fortra n函数C函数COMPLEX FUNCTIONCF( a1,a2,.,an)cf_ ( retur n, a1, a2,., an)struct float r, i; * return表11 -13返回COMPLEX 数据的函数(32位SPARC )Fortra n 调用 CC 调用 Fortra nCOMPLEX U, V, RETCPX EXTERNAL RETCPXU = ( 7.0, -8.0)V = RETCPX(U)struct complex float r, i; ;struct

35、 complex c1, c2; r = 7.0;u - i = -8.0;retfpx_( v, u );struct complex float r, i; ;void retcpx_( temp, w )struct complex *temp, *w;temp-r = w-r + 1.0;temp-i = w-i + 1.0;return;COMPLEX FUNCTIONRETFPX(Z)COMPLEX ZRETFPX = Z + (1.0, 1.0)RETURNEND11.5.2.2 64 位 SPARC 平台在64位SPARC环境下,在浮点寄存器中返回 COMPLEX值:在%f0和

36、%f1中返回 COMPLEX和 DOUBLECOMPLEX 在%f0、f1、%f2 和 %f3 中返回COMPLEX*32。对于64位SPARC,返回结构(其字段均为浮点型)的 C函数将在浮点寄存器中返回该结构,但条件是最多需要4个这样的寄存器进行此操作。在64位SPARC 平台上,Fortran函数及其相应的 C函数的一般样式如下:Fortra n函数C函数COMPLEX FUNCTION CF( a1,a2, ., an)struct float r,i; cf_ (a1,a2, ., an)表11 -14返回 COMPLEX 数据的函数(64位SPARC )Fortra n调用 C1CO

37、MPLEX U, V, RETCPXEXTERNAL RETCPXU = ( 7.0, -8.0)V = RETCPX(U)struct complex float r, i; ;struct complex retcpx_(struct complex *w ) struct complex temp;temp.r = w-r + 1.0;temp.ii = w-i + 1.0;return (temp);1C 调用 Fortra n1struct complex float r, i; ; struct complex c1, c2;Fortra n调用 CC 调用 Fortra nstr

38、uct complex *u=&c1;extern struct complex retfpx_(struct complex *); u - r = 7.0;u - i = -8.0;retfpx_( u );COMPLEX FUNCTION RETFPX(Z)COMPLEX ZRETFPX = Z + (1.0, 1.0)RETURNEND11.5.3 返回 CHARACTER 串不鼓励在C与Fortran例程之间传递字符串。但是,具有字符串值的 Fortran函数等 同于具有两个附加第一参数(数据地址和串长度)的C函数。Fortran函数及其相应的C函数的一般样式如下:Fortra n函

39、数C函数CHARACTER*! FUNCTION C( a1, ., an)void c_ (result, le ngth, a1,.,an)char result ;long len gth;以下是一个示例表11 -15返回 CHARACTER 串的函数CHARACTER STRING*16,CSTR*9STRING =STRING = 123 /CSTR( * ,9)void cstr_( char *p2rslt, longrslt_le n,char *p2arg, int *p2 n,longarg_le n ) /* return n copies of arg*/int cou

40、n t, i;char *cp;count = *p2 n;cp = p2rslt;for (i=0;ico unt;i+)*cp+ = *p2arg ;void fstr_( char *, lo ng,char *, int *,long );char sbf9 = 123456789;char *p2rslt = sbf;int rslt_le n =sizeof(sbf);char ch = *;int n = 4;int chen = sizeof(ch);/* make n copies of ch insbf*/fstr_( p2rslt, rslt_le n,&ch, &n,

41、ch_le n );FUNCTION FSTR( C, N)CHARACTER FSTR*(*), C FSTR =DO I = 1,NFSTR(I:I) = CEND DOFSTR(N+1:N+1) = CHAR(0)END在本例中,C函数和调用C例程必须在列表(字符参数的长度)末尾提供两个额外的 初始参数(指向结果字符串和串长度的指针)和一个附加参数。请注意,在从C中调用的Fortran例程中,需要显式添加一个末尾空字符。缺省情况下,Fortran字符串不以空字符终结。11.6带标号的COMMON可以在 C中使用全局struct 来模拟 Fortran带标号的 COMMON表11 -16模拟带标号的 COMMONFortran COM MON 定义C “ COMMO 定义COMMON /BLOCK/ALPHA,NUMextern struct block float alpha;int num;extern struct block block_ ;main ()block_.alpha = 32.;block_. num += 1;请注意,C例程建立的外部名称必须以下划线

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论