fortran与c语言接口参数传递混合编程

上传人:206****923 文档编号:88626328 上传时间:2019-05-05 格式:DOC 页数:27 大小:298KB
返回 下载 相关 举报
fortran与c语言接口参数传递混合编程_第1页
第1页 / 共27页
fortran与c语言接口参数传递混合编程_第2页
第2页 / 共27页
fortran与c语言接口参数传递混合编程_第3页
第3页 / 共27页
fortran与c语言接口参数传递混合编程_第4页
第4页 / 共27页
fortran与c语言接口参数传递混合编程_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《fortran与c语言接口参数传递混合编程》由会员分享,可在线阅读,更多相关《fortran与c语言接口参数传递混合编程(27页珍藏版)》请在金锄头文库上搜索。

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 站点http:/www.j3-fortran.org获得)。Fortran 95 编译器实现了标准中所述的这些功能。如不特别注明,32 位 x8

2、6 处理器视为与 32 位 SPARC 处理器等同。对于 64 位 x86 处理器和 64 位 SPARC 处理器也是如此,只是 x86 系统未定义 REAL*16 和 COMPLEX*32 数据类型,这些数据类型只能用于 SPARC。11.1 兼容性问题大多数C-Fortran 接口必须在以下这些方面全部保持一致: 函数和子例程的定义及调用 数据类型的兼容性 参数传递(按引用或按值) 参数的顺序 过程名(大写、小写或带有结尾下划线 (_)) 向链接程序传递正确的库引用某些 C-Fortran 接口还必须符合: 数组索引及顺序 文件描述符和stdio 文件权限11.1.1 函数还是子例程?函数

3、一词在C 和 Fortran 中有不同的含义。根据具体情况做出选择很重要: 在 C 中,所有的子程序都是函数;但void函数不会返回值。 在 Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。当 Fortran 例程调用 C 函数时: 如果被调用的 C 函数返回一个值,则将其作为函数从 Fortran 中调用。 如果被调用的 C 函数不返回值,则将其作为子例程调用。当 C 函数调用 Fortran 子程序时: 如果被调用的 Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。 如果被调用的 Fortran 子程序是一个子例程,则将其作为一个返

4、回int(与 FortranINTEGER*4兼容)或void值的函数从 C 中调用。如果 Fortran 子例程使用交替返回,则会返回一个值,这种情况下它是RETURN语句中的表达式的值。如果RETURN语句中没有出现表达式,但在SUBROUTINE语句中声明了交替返回,则会返回零。11.1.2 数据类型的兼容性表 112总结了 Fortran 95(与 C 比较)数据类型的数据大小和缺省对齐。该表假设未应用影响对齐或提升缺省数据大小的编译选项。请注意以下事项: C 数据类型int、longint和long在 32 位环境下是等同的(4 字节)。但是,在 64 位环境下long和指针为 8

5、字节。这称为 LP64 数据模型。 在 64 位 SPARC 环境下,当用任意-m64选项进行编译时,REAL*16和COMPLEX*32与 16 字节边界对齐。 标有 4/8 的对齐表示缺省情况下与 8 字节边界对齐,但在 COMMON 块中与 4 字节边界对齐。COMMON 中的最大缺省对齐为 4 字节。当用-m64选项进行编译时,4/8/16 表示与 16 字节边界对齐。 REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、COMPLEX*32只能用于 SPARC 平台。 数组和结构的元素及字段必须兼容。 不能按值传递数组、字符串或结构。 可以在调用点使用%VA

6、L(arg),按值将参数从 Fortran 95 例程传递到 C 例程。假如 Fortran 例程具有一个显式接口块,该接口块用VALUE属性声明了伪参数,则可以按值将参数从 C 传递到 Fortran 95。 数值序列类型的组件的对齐方式与通用块的对齐方式相同,也会受到-aligncommon选项的影响。数值序列类型是这样一种序列类型:其中所有组件的类型为缺省整数、缺省实数、双精度实数、缺省复数或缺省逻辑,而不是指针。 在大多数情况下,非数值序列类型的数据类型组件以自然对齐的方式对齐,但 QUAD 变量除外。对于四精度变量,32 位 SPARC 平台和 64 位 SPARC 平台之间的对齐方

7、式不同。 在所有平台上,用 BIND(C) 属性定义的 VAX 结构和数据类型的组件始终与 结构具有相同的对齐方式。表 111 数据大小与对齐(以字节表示) 按引用传递(f95和cc)Fortran 95 数据类型C 数据类型大小对齐BYTE xchar x11CHARACTER xunsigned char x ;11CHARACTER (LEN=n) xunsigned char xn ;n1COMPLEX xstruct float r,i; x;84COMPLEX (KIND=4) xCOMPLEX (KIND=8) xCOMPLEX (KIND=16) x(SPARC)struct

8、float r,i; x;struct double dr,di; x;struct long double, dr,di; x;8163244/84/8/16DOUBLE COMPLEX xstruct double dr, di; x;164/8DOUBLE PRECISION xdouble x ;84REAL xfloat x ;44REAL (KIND=4) xREAL (KIND=8) xREAL (KIND=16) x(SPARC)float x ;double x ;long double x ;481644/84/8/16INTEGER xint x ;44INTEGER (

9、KIND=1) xINTEGER (KIND=2) xINTEGER (KIND=4) xINTEGER (KIND=8) xsigned char x ;short x ;int x ;long long int x;12484444LOGICAL xint x ;44LOGICAL (KIND=1) xLOGICAL (KIND=2) xLOGICAL (KIND=4) xLOGICAL (KIND=8) xsigned char x ;short x ;int x ;long long int x;1248444411.1.3 大小写敏感性C 和 Fortran 在区分大小写方面采取截然

10、相反的处理方法: C 区分大小写大小写很重要。 Fortran 在缺省情况下忽略大小写。f95缺省通过将子程序名转换成小写来忽略大小写。除了字符串常量以外,它会将所有大写字母都转换成小写字母。对于大/小写问题,有两种常用解决方案: 在 C 子程序中,使 C 函数名全为小写。 用-U选项编译 Fortran 程序,该选项会通知编译器保留函数/子程序名称的现有大/小写区别。只能采用这两种解决方案中的一种,不能同时采用。本章大多数示例的 C 函数名均采用小写字母,并且没有使用f95-U编译器选项。11.1.4 例程名中的下划线Fortran 编译器通常会在入口点定义和调用中都出现的子程序名末尾追加一

11、个下划线 (_)。该惯例不同于具有相同的用户指定名称的 C 过程或外部变量。几乎所有 Fortran 库过程名都有两个前导下划线,以减少与用户指定的子例程名的冲突。对于下划线问题,有三种常用解决方案: 在 C 函数中,通过在函数名末尾追加下划线来更改该名称。 使用BIND(C)属性声明来指明外部函数是 C 语言函数。 使用f95-ext_names选项编译对无下划线的外部名称的引用。只能使用上述解决方案中的一种。本章的示例都可以使用BIND(C)属性声明来避免下划线。BIND(C)声明可从 Fortran 调用的 C 外部函数,以及可从 C 中作为参数调用的 Fortran 例程。Fortra

12、n 编译器在处理外部名称时通常不追加下划线。BIND(C)必须出现在每个包含这样的引用的子程序中。惯常用法是: FUNCTION ABC EXTERNAL XYZ BIND(C) ABC, XYZ在此处,用户不仅指定XYZ是外部 C 函数,而且还指定 Fortran 调用程序ABC应该可以从 C 函数调用。如果使用BIND(C),C 函数不需要在函数名末尾追加下划线。11.1.5 按引用或值传递参数通常,Fortran 例程按引用传递参数。在调用中,如果非标准函数%VAL()中包含一个参数,则调用例程会按值传递该参数。Fortran 95 按值传递参数的标准方法是通过 VALUE 属性和 IN

13、TERFACE 块。请参见11.4 按值传递数据参数。C 通常按值传递参数。如果在参数前加上表示“和”的符号 (&),C 会使用指针按引用传递参数。C 总是按引用传递数组和字符串。11.1.6 参数顺序除字符串参数之外,Fortran 和 C 均以相同的顺序传递参数。但对于每个字符型参数,Fortran 例程都会传递一个附加参数,用以指定串长度。这些参数在 C 中是longint数量,按值进行传递。参数顺序为: 与每个参数相应的地址(数据或函数) 与每个字符参数对应的longint(字符串长度的完整列表位于其他参数的完整列表之后)示例:Fortran 代码片段:等价的 C 代码片段:CHARA

14、CTER*7 SINTEGER B(3). CALL SAM( S, B(2) )char s7;int b3;.sam_( s, &b1, 7L ) ; 11.1.7 数组索引和顺序Fortran 与 C 的数组索引和顺序不同。11.1.7.1 数组索引C数组总是从 0 开始,而 Fortran 数组在缺省情况下是从 1 开始。有两种常用的索引处理方法。 如上述示例所示,可以使用 Fortran 缺省设置。此时,Fortran 元素B(2)等同于 C 元素b1。 可以指定 Fortran 数组 B 以 B(0) 开始,如下所示: INTEGER B(0:2)这样,Fortran 元素B(1)就等同于 C 元素b1。11.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这

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号