c和fortran混编(基于GNULinux)
VC++与Fortran的混合编程
VC++调用Fortran子程序VC++友好的界面制作和Visual Fortran强大的计算和数据处理功能,两者结合可开发行程界面友好、操作直观方便、功能强大的应用程序。
如何进行VC++调用VisualFortran子程序模块,就成了需要解决的问题。
1、VC++调用FORTRAN子程序的方式(1)同一工程包含VC++和Fortran语言文件对同一版本集成后的编译器可以根据不同的扩展名选择编译方式,生成目标代码文件.OBJ,然后按照指定的调用方式进行链接,生成可执行文件.EXE。
(2)VC++工程文件引用Fortran语言生成的.OBJ或.LIB文件对不同版本的编译器安装集成后,VS不会自动根据文件扩展名选择编译方式,这时需用不同的工程文件。
首先对Visual Fortran 建一工程文件,生成.OBJ文件或.LIB文件,然后在VC++工程中按照指定的调用方式进行调用,编译链接,生成可执行文件.EXE。
(3)VC++工程文件调用Fortran语言生成的.DLL将已有的Fortran程序生成dll模块,有利于移植和修改,可提高效率,这样即使原dll模块中的算法做过修改,只要保证函数或子例行程序名字和入口参数不变,主调用过程无须进行重新修改或者编译。
2、VC++中的声明在C++语言中调用Fortran的函数或模块,必须在C++语言的函数名前面冠以_s td call或_cdecl关键字申明调用方式,以便编译器按照约定方式进行正确的参数传递,包括参数传递顺序、参数传递方式、堆栈处理和命名修饰等问题。
C++语言调用Fortran模块的声明:extern “C” {void _stdcall SUBROUTINE(形式参数1,float TC[],float PC,……);float _stdcall FUNCTION(形式参数1,float TC[],float PC,……); } 或extern “C” {void _cdecl SUBROUTINE(形式参数1,float TC[],float *PC,……);float _cdecl FUNCTION(形式参数1,float TC[],float *PC,……); } 其中TC为数组变量。
嵌入式Linux下C和汇编的混合编程
2.6 嵌入式Linux下C和汇编的混合编程2.6.1 混合编程概述2.6.1.1 C和汇编的混合编程及类型C语言是被称为高级的低级语言,原因是在C语言中,有许多针对硬件的操作,能很好地利用硬件特性。
从一方面来说,C语言也是高级语言,它能很方便地实现各种复杂的编程算法。
在嵌入式系统编程中,C语言是首选的程序设计语言,但在某些特定条件下,C语言无法精确地操作硬件,此时往往采用嵌入或调用汇编程序的方法来解决此类问题。
这就是混合编程。
混合编程从方式上主要包括三类,即:C程序调用汇编程序;汇编程序调用C程序;C程序内嵌汇编。
本文后续将分别介绍这三类编程方法。
2.6.1.2 ATPCS规范简介基于ARM的嵌入式C和汇编的混合编程需要遵循一定的规范,这就是过程调用标准ATPCS 规范。
ATPCS规定了子程序间相互调用的基本规则,调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。
2007年,ARM公司推出了新的过程调用标准AAPCS(ARM Architecture Produce Call Standard),它只是改进了原有的ATPCS的二进制代码的兼容性。
这里简单介绍寄存器的使用规则、数据栈的使用规则、参数的传递规则和子程序结果返回规则,更详细的内容请参考其它参考资料。
1. 寄存器使用规则●子程序间通过寄存器R0~R3传递参数,寄存器R0~R3可记作A1~A4。
被调用的子程序在返回前无须恢复寄存器R0~R3的内容。
●在子程序中,ARM状态下使用寄存器R4~R11来保存局部变量,寄存器R4~R11可记作V1~V8;Thumb状态下只能使用R4~R7来保存局部变量。
●寄存器R12用作子程序间调用时临时保存栈指针,函数返回时使用该寄存器进行出栈,记作IP;在子程序间的链接代码中常有这种使用规则。
●通用寄存器R13用作数据栈指针,记作SP。
●通用寄存器R14用作链接寄存器。
●通用寄存器R15用作程序计数器,记作PC 。
混合编程c++与Fortran
1.VS2008+INTELfortran.Fortran为主程序,调用c++函数2.VS2008的设置(1)在已有的fortran工程的解决方案中添加新的c++工程:解决方案可以有好多工程;但是每个工程只能是单独计算机语言的工程,即fortran用fortran建立工程,c++用c++建立工程。
设置解决方案中,各个工程之间的依赖关系。
(2)混合编程的几种方法:c++源文件编译为目标文件与fortran链接合成;c++源文件编译为库文件,然后fortran链接的时候将该库加入。
2.设置runtimelibrary:Multithreaded;而d e bug模式中,r untime library竟然是:M u ltithreaded DLL然能链接通过。
换M u ltithread 和M u ltithreaded DLL 竟的候有而且时,出错交3. 设置项目依赖关系:项目-》项目依赖项3)链接选项(以c++为静态链接库为例)如图库,下接(1)构建或改变c++工程为静态链(2)在主较多:设置比要程(f o rtran工程),需工设置l inker里面附加库(a d ditionary library)的目录和库名称linker-》additionay Library directory设置为:F:\LBM_MOVING_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBLE\Release(c++编译为静态库,库所在的目录)\称设置名:库的加附F:\LBM_MOVING_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBL E\Release\beamcpp.liblinker-》input-》a ddtionary dependencies:F:\LBM_MOVI NG_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBLE\Release\beamcpp.lib4)源程序c++函数的f ortran接口fortran为主程序,即program main{implicit noneint::i,jdoubleprecision,dimension(20)::p.....call GETBEAMDV(i,j,p...)}c++程序中#include <assert.h>#include <iostream>#include <fstream>#include <string>class myclass{...};extern "C"{void GETBEAMDV(int* ,int*,double*);}void GETBEAMDV(int* MM,int*kk,double* Pld){.....return;};几点注意:(1)ifort 编译后(fortran源程序),其函数名为大写名称前方加底横线:如“_GETBEAMDV”(2)VISUAL C++编译后(c++源程序),其函数名也为大写名称前方加底横线:如“_GETBEAMDV”因此,只需相同名称就可以了,比codeblock简单些!!!另外,为了使程序在codeblocks 和 vs2008一致,可在vs2008中进行设置,包括c++和fortran工程中添加编译和链接选项分别为:简单在vs2008的fortran工程中添加编译选项:/names:lowercase增只要加“_”的话这样call getbeamdv(i,j,p...) !!getbeamdv_((i,j,p...))用于intel fortran 编译(编译选项添加/names:lowercase,具体参见vs2008+ifort)。
C++ Fortran混合编程
C/C++/Fortran混合编程浅谈(一)直接链接方式现今流行很多编程语言,在编译型语言中,C/C++/Fortran语言应用非常广泛,C以其效率高效底层操作为著称,C++以其很好的面向对象类框架泛型编程为特点,Fortran则以现世存有大量的计算程序而占有重要的位置,在编程中,集合他们三者的长处是个很好的做法。
混合编程有很多方法,以下介绍一下基本方法。
对于各个编译器,如果编译中间的二进制文件.o或.obj的结构相同,则可以直接链接混合编程。
遵循约定:C/C++默认传值,Fortran传址。
一、相同编译器家族以gcc家族为例,类似的还有Intel C Compiler和Intel Fortran Compiler等。
1、C和Fortran(1)C调用Fortranmain.csub.f90sub.f90(F2003方式)链接方法gcc –o main.o –c main.cgfortran –o sub.o –c sub.f90gcc –o main.exe main.o sub.o或者直接gcc –o main.exe main.c sub.f90 输出(2)Fortran调用Cmain.f90sub.c链接方式gcc –o sub.o sub.cgfortran –o main.o main.f90 gfortran –o main.exe main.o sub.o 或是直接gfortran –o main.exe main.f90 sub.c 输出visual C++与FORTRAN混合编程(2010-04-22 14:15:25)转载标签:分类:科研visualcfortran混合编程原文:/143577510.html本文示例说明用C++编写的主程序调用采用FORTRAN语言编写的子程序的方法。
方法一:直接在Microsoft Developer Studio创建包含c语言和FORTRAN语言的工程。
fortran与c语言接口参数传递混合编程
fortran与c语言接口参数传递混合编程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 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。
11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:函数和子例程的定义及调用数据类型的兼容性参数传递(按引用或按值)参数的顺序过程名(大写、小写或带有结尾下划线(_))向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:数组索引及顺序文件描述符和stdio文件权限11.1.1 函数还是子例程?函数一词在C 和Fortran 中有不同的含义。
根据具体情况做出选择很重要:?在C 中,所有的子程序都是函数;但void函数不会返回值。
在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。
当Fortran 例程调用C 函数时:如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。
如果被调用的C 函数不返回值,则将其作为子例程调用。
当C 函数调用Fortran 子程序时:如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。
C与C++与FORTRAN混合编程
C/C++/FORTRAN 混合编程混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。
混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。
1 Windows平台函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。
考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。
( C/C++编译器使用Microsoft Visual C++ 6.0, Fortran编译器使用 Digital Visual Fortran 6.0)。
假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可:#ifdef __cplusplusextern “C” void {#endifextern void __stdcall CFunction();#define cFunction CFUNCTION#ifdef __cplusplus}#endif这样,在Fortran或者C++的程序里面就可以直接调用了。
假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了:#ifdef __cplusplusextern “C” void {#endifextern void __stdcall ffunction();#define ffunction FFUNCTION#ifdef __cplusplus}#endif这样,就可以在C++的程序里面直接调用。
由于C编译器里面,没有定义__cplusplus这个环境变量,因此,C文件里面,也可以直接使用这个头文件。
如果是一个C++函数,如: void cPlusplusFunction();和c函数一样,进行下面的定义即可:#ifdef __cplusplusextern “C” void {#endifextern void __stdcall cPlusplusFunction ();#define cPlusplusFunction CPLUSPLUSFUNCTION#ifdef __cplusplus}经过上面的定义后,所有的函数便可以在三种语言中自由调用。
C_与Fortran混合编程技术
11
研究与探讨
C++ 编程语言的调用 ABDS软件是在AutoCAD R14图形平台上开发实
2 C++ 语言和 Fortran 语言的差异
FORTRAN 语言发展之初就被认为是科学计算的 专用语言 C最初出现是用作UNIX操作系统的记述 语言 发展之初一直作为 较低级语言 编写与硬 件关系密切的底层软件 由于 UNIX 的成功和广泛 使用 C 语言开始流行起来 并成为一种普遍使用 的程序设计语言
研究与探讨
C++ 与 Fortran 混合编程技术
王红林 刘岩 边保林 梁晓 中国建筑科学研究院计算中心
摘要 本文简要介绍了采用 C++ 与 Fortran 混合编程技术 分析表明 ABDS 采用混合编程技术 极大地保
护了已有的分析资源 同时又充分享受到 C++ 带来的方便和快捷 关键词 混合编程 面向对象 调用协议
ABDS 软件中 采用 Fortran语言编写结构计算 分析程序 采用 C++编写交互输入界面和图形处理 以及辅助设计部分 本文重点介绍ABDS软件中C++ 与 Fortran 混合编程技术
1 C++ 语言和 Fortran 语言的发展
在程序设计语言的发展过程中 FORTRAN 语言 被认为是科学计算的专用语言 后来推出的 FOR- TRAN 90 和 FORTRAN 95 版本也不例外 它们虽然 可以完全实现 C++ 语言同样的功能 然而其软件开 发环境和软件的集成性等方面都远不如 C++ 语言 近年来 随着计算机软硬件技术的发展 数据结构 数据库管理技术 可视化与计算机图形学 用户接 口 系统集成以及人工智能等领域的成果被逐渐应 用到结构分析软件中 结构分析软件的设计并不仅 仅局限于单一的科学计算 需要涉及众多的软件开 发领域 C++ 语言可以提供这类软件开发所需的功 能 而用 FORTRAN 90 却很难实现 另一方面 从 软件的编程环境来看 目前 FORTRAN 90 的编译器 极少 而 C++ 语言的编译系统相当普及 可以运行 在各种机型上 便于实现跨平台的软件系统集成
C#与Fortran混合编程-本地调用Fortran动态链接库
C#与Fortran混合编程-本地调用Fortran动态链接库Fortran是一门古老的语言,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。
FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。
然而Fortran程序本身不适合开发独立的应用程序,例如我们传统的桌面应用或者Web应用。
因此这里我们便想将C#与Fortran 结合,C#借助Fortran可以实现精度更高,计算更快的程序,而Fortran通过C#,便也能够达到可视化设计。
一、基本思路运用Fortran,编写动态链接库(DLL),在DLL中提供计算的函数接口,然后在C#中调用该DLL中计算部分的函数,实现计算过程。
这里需要注意的是,由于我们使用的是Fortran编译器,生成的DLL属于第三方非托管DLL,因此无法直接在程序中添加DLL的引用。
具体的做法将在后续部分说明。
二、编写Fortran程序,生成动态链接库文件知道思路之后便开始正式的Coding。
首先新建一个空的Fortran Dynamic-link Library项目。
在Intel(R) Visual Fortran点击Library,选中右图的Dynamic-link Library.然后点击OK.这时的项目如下所示:点击Sources File文件夹,选择新建项。
添加一个新的Fortran文件然后便开始Fortran代码的编写工作。
这里我们主要实现两个方法:一个方法是求两个数相加之和,并返回结果。
另一个是输入一个数组,对这个数组进行排序,并找出最大值,最后返回排序后的结果,并返回最大值。
这里我们分别演示的是Fortran传出一个数和一个数组有何不同。
关于Fortran的基本语法不是本文的讨论范畴,请读者自行查阅资料。
下面给出的上述我们要实现的功能的具体Fortran代码:DOUBLE PRECISION FUNCTION ADD(A,B)!DEC$ ATTRIBUTES DLLEXPORT::ADD!DEC$ ATTRIBUTES STDCALL,ALIAS:'Add'::ADDDOUBLE PRECISION:: A,BADD=A+BENDFUNCTION SORTANDFINDMAX(ARRAY,LENGTH)!DEC$ ATTRIBUTES DLLEXPORT::SORTANDFINDMAX!DEC$ ATTRIBUTES STDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAX DOUBLE PRECISION ::ARRAY(LENGTH)INTEGER::I,JDOUBLE PRECISION::SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DO I=1,LENGTH-1DO J=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J)) THENTEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMPSORTANDFINDMAX=ARRAY(J)END IFEND DOEND DOEND上面我们声明了两个Fortran函数,一个是计算两个数相加,一个是选择排序并找出最大值。
一种Fortran和C++混合编程规范化方法
一种Fortran和C++混合编程规范化方法作者:陈磊徐烂来源:《电脑知识与技术》2014年第13期摘要:目前,在科学计算领域有不少程序采用了Fortran和C++两种语言进行混合编程(即“混编”),但现有混编的程序代码可读性差,可维护性差,严重影响了软件的可移植性和可重用性。
针对此现状,笔者总结了自己在核电软件开发中的实际经验,分三步阐述了Fortran和C++混合编程的规范化:首先,用宏定义等方法实现C++类型与Fortran类型的映射;然后,对于简单类型的参数传递,提出规范性意见;最后,对于Fortran中的特殊类型,提出在C++中用封装类型进行定义。
经过对比验证,证明规范化的混合编程确实增加了代码的鲁棒性,可维护性。
关键词:混合编程;FORTRAN;C++中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)13-2962-05A Normalization Method of Mixed-programming with FORTRAN and C++CHEN Lei, XU Lan(College of Computer Science and Technology, University of South China, Hengyang 421001, China)Abstract: Nowadays in scientific computing, a mixed-programming technology with FORTRAN and C++ program language is adopted in many programs. While lots of mixed programs have the problems of bad readability and maintainability, so it have a bad influence on the reusability of software. According to the situation, author sum up experiences and come up with a solution how to improve the mix-programming by three step. Firstly, use a macro definition method to realize the type-map between FORTRAN and C++. Secondly, to the base-type parameter passing, propose an idea about normalization. At last, propose a solution that use a C++ use-defined type for the special type in FORTRAN. By validating the results of before the normalization and after it, mixed-programming with normalization did improve the maintainability and robustness of the code.Key words: mixed-programming; FORTRAN; C++目前,在科学计算领域有不少程序采用了Fortran和C++两种语言进行混合编程,充分利用了两者的优势,提高软件开发效率[1-2]。
C和fortran混合编程体验报告
C/C++ 中的未界说行动、众多的宏界说,也会坑得人生涯不克不及自理。
更多的,是Fortran 所代表的编程范式的成绩,由于一门说话包括了它的编程范式。
Fortran 有编程范式么?若说有,那也许可以用这几个词来描述:粗鲁、凌乱、不计后果。
这时候,Fortran 的“语法严谨”便显得有些好笑:这反倒使得法式员再也不胆小如鼠,成果把本身堕入更多的坑中。
一旦一份代码用上了Fortran,则每每意味着,这份代码背上了繁重的汗青累赘——你可以说它融汇了前人的聪明,但你更应该看到前人的范围,和,由丝毫之流般的偷懒汇成的江河般众多的愚笨和短视。
以是,如下几个成绩中,至少呈现一个的概率,将变得异常大:1. 调换平台编译时、编译旧代码时,动辄失足,且难以排查——许多时刻是由于gfortran 的F77 兼容形式不克不及完整兼容某些写法,剩下则多是ifort 和gfortran (和它们各自的用户)间的,多数时刻是代码中调用的某些库的API 做了个不痛不痒的更名;2. 代码中有goto;3. 你会看到一个上千行乃至几千行的subroutine/function;4. 你会看到一个有一百多个参数的subroutine/function;5. 各类不知所云的变量名,和完整无用的正文;6. “if a > 0”编译差错,由于,“你那个0 是个短整形,而 a 是个长整/浮点”;7, 你得常常跑到一个函数的开首去看一个变量的界说;8. write 的某个数字超宽了?祝贺你,你得到了一堆星号,谁关怀你辛辛苦苦跑进去的数字去哪儿了啊——我固然晓得这么做有它固有的缘故原由,不外,这真是“时代的范围”五个字的最佳样本之一;9. 各类没有推测的欣喜,酸爽非常,把least surprise 准则损坏殆尽。
最重要的,一份用上Fortran 的代码,很能够有着根本没写过代码、速成培训后大干快上大炼钢铁的半吊子法式猿/法式媛——哪怕,他们能够是异常优良的科研职员,他们的智商能够是我的两倍阁下乃至三倍多,然则,不会写法式便是不会写法式。
VC与Fortran混合语言编程
VC 与Fortran 混合语言编程 肖晓玲,卢正鼎 (华中理工大学计算机科学与技术学院,湖北武汉430074) 张 翔 (江汉石油学院地球物理勘探系,湖北荆州434102)[摘要]V C 与Fortran 混合语言编程时,按调用方式与实现的不同,调用约定主要采用C 与STDCALL 属性的调用约定。
命名约定一般使符号名表现为纯大写的名称、纯小写的名称或混合书写形式名称。
不同语言之间参数数据的传递主要通过:①调用变量参数列表;②数据、过程模块结构;③将变量声明为公用、外部和全局类型这3种方式来实现。
采用V C 与Fortran 混合语言编程设计了大地电磁测深一维交互式解释系统。
[关键词]程序设计方法;Fortran ;V C 混合语言[中图分类号]T P 311111[文献标识码]A [文章编号]10009752(2000)02007104混合语言编程是采用2种或2种以上的编程语言组合编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,从而形成一种程序实体的过程,也称为程序接口。
在软件编制和开发工作中,如果开发的软件规模较小,具有较简单的科学计算或数据处理,那么,只选择一种高级语言或者数据库语言来编程是可行的;然而,对于要开发功能很强、规模很大的大型应用软件,并且软件中既具有大量数据处理,又具有大量科学计算,甚至具有较强的实时功能的系统来说,采用单一的高级语言很难完成预期的计划和功能,而且在编程中也遇到很大的麻烦。
因为各种语言都有其长处,也有其局限性,一种语言鞭长莫及之处,正是另一种语言的驾轻就熟之区。
集各语言之精华,扬长避短,就可以大大提高系统的效率、功能和灵活性。
Fortran 语言是流行较广的适用于科学计算的高级语言,其标准化程度高,便于程序交换,较易优化,拥有高精度的数据结构与运算结构。
而V isual C ++与硬件底层打交道具有强大优势,便于图形系统的开发,已成为W indow s 系统平台上最强大的应用程序开发系统之一。
基于C#与FORTRAN混合编程的精密单点定位软件研制
( S c h o o l o f Ge o s c i e n c e s a n d Te c h n o l o g y ,Chi n a Un i v e r s i t y o f Pe t r o l e u m ,Qi n g d a o 2 6 6 5 8 0,Ch i n a )
发 中应 用 广 泛 。C#是 目前 最 新 的 一 种 基 于 . NE T 平 台 的面 向对象 开 发 语 言 , 具 有 强 大 的界 面 开 发 平
台, 适用 于 交互 式 图形界 面 的 系统开 发 l l 】 。因此 , 基
双频接 收机 的伪距 和 载波 相 位 观 测值 , 单 机 即可 实 现从毫 米 到 厘 米 级 的 静 态 定 位 以及 厘 米 到 分 米 级 的动态 定 位 l 5 ] 。P P P技 术 无 需 建 立 基 准 站 , 不 受 作 用距 离 的限制 , 目前 已成 为 G P S精 密定 位 和导 航 的重要 手段 , 在 GP S气 象 学 、 地震 形 变监 测 、 远程 海 上 动态 精密 定位 等 领 域 得 到广 泛 应 用 。 目前 , 国际 上 著 名 的 几 个 定 轨/ 定 位 软 件 如 GI P S Y、
验证 。
关键 词 : c#; F ( ) RT R AN; 混 合编程 ; 精 密单 点定 位 中图分类号 : P 2 2 8 ; T P 3 1 7 文献 标志码 : A 文章 编号 : 1 0 0 6 — 7 9 4 9 ( 2 0 1 3 ) 0 5 — 0 0 0 9 0 4
(完整版)Fortran混合编程
Extern “C”Void _ stacall s1(float a, float b,float * c);
参数传递协议(二)
——参数数目
C++可以定义参数可选的函数,对于这种情况
Fortran如何处理呢?
extern “C” float func(float x,float a=0,float b=0)
参数传递协议(一)
——参数传递方式
区别是什么呢……
参数传递方式由Attributes属性指定,两种方式: 方式一、c,stdcall选项: Subroutine s1(a,b,c)
!DEC$ attributes C :: s1 Real(4) a, b,c
End subroutine C、stdcall声明过程遵循Windows标准参数传递方 式,就是C语言参数传递模式
选项C的作用,在后面堆栈管理约定时详细介绍。
参数传递协议(三)
——数据类型
Fortran和C/C++对应的数据类型
Fortran Integer(2) Integer(4)
Real(4) Real(8)
C/C++ short Int,long float double
命名约定
名称约定包括变量名称、例程名称、模块名称 (fortran)等。
主程序: Program a1 Write(*,*) func(1.0,3.0)
end
参数传递协议
——参数数目 结论: 如果Fortran需要调用带有可选参数的C++函数,
须在fortran程序中用c,Varying对例程进行声明。
!dec$ attributes c,varying :: 例程名
基于Linux的Fortran与C/C++混合编程
基于Linux的Fortran与C/C++混合编程李霞;亓雪冬【期刊名称】《现代计算机(普及版)》【年(卷),期】2012(000)002【摘要】Fortran、C/C++是用户数量最多,使用最为广泛的编程语言.存在大量优秀的软件包及源代码,通过混合编程可以合并不同语言的优势,充分利用目前存在的这些软件资源。
分析在Linux系统中Fortran与C/C++混合编程基本原理和内部调用约定.并通过实例阐述了使用C/C++调用Fortran77编写的线性代数软件包LAPACK的方法。
实践表明,这种方法有效且可靠。
%Fortran and C/C++ are some programming languages used widely and have largest number of users. And a lot of software and source program are coded in them. Mixed programming of For- tran and C/C++ can combine the advantages of different languages. Analyses the basic principle and interlanguage conventions of mixed Fortran and C/C++ language programming in Linux sys- tem, and expounds the method of using Fortran77 LAPACK subroutines in C program. Experi- mental result shows that this method is available and reliable.【总页数】4页(P57-60)【作者】李霞;亓雪冬【作者单位】中国石油大学信息与控制工程学院,青岛266555;中国石油大学计算机与通信工程学院,青岛266555【正文语种】中文【中图分类】TP311.52【相关文献】1.C/C++与FORTRAN混合编程技术及其应用研究 [J], 周谧2.C++与Fortran混合编程在多点地质统计建模中的应用 [J], 冯文杰;尹艳树;毛锐;石书缘3.C、C++、Fortran混合编程技术研究与问题处理 [J], 邹倩倩;孙沛;杨冰;孙梦婕4.C、C++、Fortran混合编程研究 [J], 魏威;魏冲5.一种Fortran和C++混合编程规范化方法 [J], 陈磊;徐烂因版权原因,仅展示原文概要,查看原文内容请购买。
C/C++与FORTRAN混合编程技术及其应用研究
C/C++与FORTRAN混合编程技术及其应用研究随着科技的不断发展,计算机语言的数量不断增多,在以往的编程工作中,通过利用多元化的计算机编程语言,的确得到了理想的效果。
但是,目前的计算机编程语言过多,在实际的编程工作中,往往会应用到两种或者两种以上的编程语言,这就在客观上增加了编程的难度,且完成的程序会因语言的增多导致瑕疵的存在,不利于最终的使用。
另一方面,就编程语言本身来讲,每一种编程语言都具有各自的特点,要想取得出色的程序设计成果,必须减少编程语言之间的各种矛盾,以此来实现程序质量的提升。
为此,日后应加强混合编程技术及其应用,为计算机技术的发展提供更多的保障。
标签:混合;编程;技术;应用到目前为止,很多的程序都是通过FORTRAN来完成编写的,运用DOS平台,实现程序编写的快速、高效。
另一方面,C/C++作为程序编写的常用语言,在计算机众多语言中具有较强的代表性。
通过研究C/C++与FORTRAN的混合编程技术,可以为日后的其他语言混合应用提供基础,并且建立多种混合编程技术应用模板,推动混合编程技术的应用。
在此,文章主要对C/C++与FORTRAN 混合编程技术及其应用展开研究。
1 C/C++与FORTRAN混合编程技术思路从客观的角度来分析,混合编程技术并不意味着完全的混合两种语言或者程序,而是在编程工作中,将两种或两种以上的编程语言,较好的联合应用,以此来实现编程效率的提升和质量的稳定。
C/C++与FORTRAN混合编程技术的思路如下:第一,通过屏幕或者是原始数据文件输入相应的数据信息,展开一系列的运算工作,在运算结束后,编程人员需要将计算结果保存在数据的文件当中。
该过程主要是通过FORTRAN来完成的。
第二,通过C/C++来优化数据的输入、计算、存储,为编程提供更多的时间。
实际上,C/C++是对FORTRAN部分工作的一种优化处理,减少不必要的措施和问题出现。
第三,计算和保存中间结果,仍然运用FORTRAN来完成。
fortran与c语言接口参数传递混合编程
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 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。
11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:•函数和子例程的定义及调用•数据类型的兼容性•参数传递(按引用或按值)•参数的顺序•过程名(大写、小写或带有结尾下划线(_))•向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:•数组索引及顺序•文件描述符和stdio•文件权限11.1.1 函数还是子例程?函数一词在 C 和Fortran 中有不同的含义。
根据具体情况做出选择很重要:•在C 中,所有的子程序都是函数;但void函数不会返回值。
•在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。
当Fortran 例程调用C 函数时:•如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。
•如果被调用的C 函数不返回值,则将其作为子例程调用。
当C 函数调用Fortran 子程序时:•如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。
•如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。
14Fortran与C的混合语言编程.pdf
参数传递
值传递还是通过引用传递 等价数据类型和数据结构 传递变量的顺序
1
Fortran & C
Fortran INTEGER(1) INTEGER(2) INTEGER(4), INTEGER INTEGER(8) REAL(4), REAL REAL(8), DOUBLE PRECISION COMPLEX(8) CHARACTER CHARACTER(n) LOGICAL(1) LOGICAL(2) LOGICAL(4) LOGICAL(8) C signed char short int int long int float double 无对应类型,可定义结构 struct complex {float r, i; } char char x[n] char short int long int
Fortran调用C语言函数
参数的调用约定:Fortran缺省参数传递为引用传递,若 在外部例程中施加了C或STDCALL调用约定,则缺省的引 用传递改为值传递(数组参数除外)。为了消除调用约定 对参数传递的影响,可以在外部例程中添加具体的参数传 递属性(REFERENCE或VALUE)声明。需要注意,参数 属性声明优先于调用约定声明,即参数属性声明最终决定 参数的传递方式。
Fortran调用C语言函数
Fortran调用C语言函数时,要在接口块中加入!MS$ ATTRIBUTES编 译伪指令告知编译器调用C函数时使用的约定
INTERFACE 例程说明语句 !定义函数FUNCTION或子例程SUBROUTINE [!MS$ ATTRIBUTES例程选项] !规定例程的调用、命名和参数传递约定 [!MS$ ATTRIBUTES参数选项] !规定参数传递的方式 例程参数声明 END 例程名称 END INTERFACE
基于Fortran与C#混编数值仿真软件系统的实现
基于 F ra ot n与 C r #混编数值 仿真软件 系统 的实现
朱泰山 1 1王一一 z,冯 国泰
(. 1 哈尔滨工业大学能源科学与工程学院 ,哈尔滨 10 0 : 50 1 2 北京大学软件 与微 电子学 院,北京 12 0 ) . 0 6 0
摘
要 : 根据计算流体 力学与数值传 热学等数值模 拟软件 的特 点 ,为了发挥各种高级语言的优 点,最好采 用混合编
mo l n C / n y i AD CAM n F NHT A e ti F / a d C D/ . c ran C D NHT c mp tt n rd i g n r td t e , ih i a f itd p r o o u a i a g i s e e ae h n wh c s n a ' ae atf ol d
H I bi . Tur ne
【 e w rs x d L n aePorm n; u eia Sm lt n D n m cLn irr;ne ae K y o d Mie— ag g rga mi N m r l i uai ; y a i ikLbay Itfc 1 u g c o r
【 s at A crigt tec aat s c o uhn m r a s ua o oe sC DN Tsf ae t b n vr Do Abt c 】 codn l h rc r t s f c u eil i lincdsa F / H ow r,o r geey r— r o } e i s i c m t t i
关 键 词 : 混 合 编程 ;数 值 仿 真 ;动 态链接 库 ;接 口
Re lz t n o mei a i lt n S se B s d aiai fNu rc S mu a i y tm a e o l o
Linux环境中Fortran与C混合编程方法研究
混 合 编 程 研 究 。 目前 , iu 作 系 统 在 科 学 研 究 和 工 程 领 域 Ln x操
已大 量 普 及 ,众 多 高 可 靠 、高 性 能 的 开 源 软 件 包 都 有 针 对 于 Ln x系 统 的版 本 。 此 研 究 Ln x系 统 中 F ra 语 言 与 C语 iu 因 iu o rn t
的基本原 理 、 实现 步 骤 , 较 了各 方 法 的 优 缺 点 和 适 用 范 围 。 比 关键词 : 混合 编 程 ; 编 程 语 言 ; 源码 转 换 工 具 ; 组 件 ; 通 用 对 象 请 求 代 理
中图 法分 类号 : P 1. T 31 2 5
文献标 识码 : A
文章 编号 :0 07 2 20 ) 927 —3 10—04(0 8 0 —3 80
维普资讯
第2 卷 9
V O129 .
第9 期
N O. 9
计 算 机 工 程 与 设 计
Co mp t r g n e i g a d De i n u e En i e rn n sg
20 年 5 08 月
Ma 0 8 y2 0
2 G o h s aPopci eerhIstt o hn lO le ,D n yn 50 2 C i ) . ep y i l rset gR sac tue f e gi i l c n ni S f d o g ig 72 , h a i 2 n
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c和fortran混编(基于GNU/Linux)2011-08-26 12:02:01| 分类:系统配置 | 标签: |字号大中小订阅/blog/static/41789395200972931110461/c和fortran混编(基于GNU/Linux) (转载于csdn,方便自己查阅)2009-08-29 15:11:10| 分类:默认分类|字号订阅转下来是自己用这个方法编译成功,推荐下。
注意如果gcc版本>=4.0,则将链接时则将-lfrtbegin -lg2c改为-lgfortran -lgfortranbegin。
其实这方面的资料网上很多,我只是总结一下说说自己的理解(因为昨天看到有个xd问到这个)。
先声明一下,我对fortran是一窍不通,只是看了看网上的程序推敲了下面几个的最简单的fortran源码。
网上说要分c为主程序和fortran为主程序两种情况讨论,其实我觉得不用,只要你了解生成可执行文件的机制。
这个机制就是:不论是单一语言模块之间的链接还是不同语言之间的混合链接,本质目的都是要链接器能找到定义于其他模块中的符号,如果全部找到,则链接成功,生成可执行的二进制文件。
下面的内容比较基础,看烦了就跳过。
比如简单的一个c程序:/* main.c */void FOO (); /* 其实按c语言的规定,调用程序之前不需声明,* c编译器会猜测函数的原型。
需要在调用之前* 定义或者声明那是c++的风格*/int main (){FOO ();return 0;}/* foo.c */#include <stdio.h>void FOO (){printf (“hello world\n”);}这两个文件都可以编译通过gcc -c main.cgcc -c foo.c这里gcc只用来编译并不链接,因为单独链接其中一个文件都是不完整的。
必须将两个目标文件(上面会生成main.o和foo.o)链接在一起。
gcc -osample main.o(gcc在编译时foo.o这里gcc 因为看到文件后缀名为.o所以直接进行链接而不再进行编译。
对文件的识别主要靠起后缀名。
如果是gcc -osample main.c foo.c那么因为后缀名为.c所以会先编译,又因为没有-c选项所以会再链接。
多说一点如果是gcc -osample main.c foo.o 那么只编译main.c文件,再将编译后的临时目标文件与foo.o链接。
gcc还会因为不同的后缀名采用不同的编译器进行编译具体参见man 或者info,因为他是compiler collection 嘛:)不好意思,绕了一大圈。
上面说到这两个文件都能独立编译(因为语法没错嘛),并且将编译出的目标文件放在一起链接就可以了。
这正是因为链接器(链接器其实是ld,gcc调用了它)在foo.o中找到了main.o中需要的foo的定义,并且在main.o中找到了main的定义。
这里还牵扯到一个问题,那就是c是很纯朴的语言,c的函数在文本文件中是什么名字,那么编译出来在目标文件(一般是.o文件)中相应的那个函数还是那个名字(不会像c++一样为了重载在函数名前后加一大堆区分符)。
比如用nm查看main.o和foo.onm main.oU FOO00000000 T mainU表示在main.o中符号foo是未定义的,需要从外部链接进来。
T表示该符号存在于这个目标文件对应的文本文件中,说白了就是有定义的符号。
nm foo.o00000000 T FOOU printf这样就可以看出,编译出的foo.o与原foo.c中的函数名都是FOO。
main.c 中调用了函数FOO,那么他编译出的这个函数的符号也还是FOO,这样对函数FOO的供与求才能对的上,链接器能找到对得上的符号才能链接成功。
有人说foo.o里还有一个未定义符号printf,这个到哪里去找?gcc总是会有很多默认链接的库和链接选项,这其中包括c 的标准库,而printf就在c标准库中。
加上-v选项就可以看出来,gcc在编译和链接时到底做了哪些事。
又多说一点,如果一个函数有定义或者被调用,那么编译后在目标文件中就会有其相应的符号,因为要告诉链接器有这个供给,或者有这个需求嘛。
如果一个函数仅仅有什么声明,那么是不会编译出它的符号的,因为它既不会给别人用,也不会用别人。
那么,说了这么多其实还是为了明确一点:要让链接器找到在一个文件中需要的符号定义,那么链接就能成功,就能生成可执行文件了。
这也是混编的关键!现在开始真真儿的了。
将主程序main.c换成fortran的c main.fprogram testexternal FOOcall FOO ()end还是原来的foo.c,也就是说由fortran调用c,仍旧是:gcc -c foo.cgcc -c main.f注意这里用的是gcc编译main.f(fortran程序),这是完全可以的。
前面说了gcc是compiler collection,它会根据文件后缀来判断是什么语言写成的,从而调用相应的编译器来编译。
.f的文件它自然会用g77或者f77之类的来编译。
与 g77 -c main.f完全一样。
为了链接成功,先来看看foo.o 和main.o中都有什么符号nm main.oU foo_00000000 T MAIN__U s_stopnm foo.o00000000 T FOOU printf可以看出,main.o里需要用到符号名为foo_但foo.o里提供的是FOO——不匹配。
一个办法就是依据上面说的c的纯朴性——写的什么名儿,编译出就是什么名儿,从而直接改变foo.c中的函数名,改为void foo_ ()即可。
这样链接时,main.o需要的foo_符号就能在foo.o中找到。
但是把c的函数名改成这个样子,感觉总是别扭。
应该看到是什么(.c中看到foo_)就用什么(而.f中用的是FOO)这样才人性化。
再说如果 fortran需要用到一个c库,这个库里的函数不一定都是小写并且最后还带下划线。
就像c++要用c库,也需要在声明这个库中的函数时使用extern “C”,使c++编译器在编译这个函数时生成的符号名是C风格而不是C++风格。
所以我们也需要类似c++的做法改变fortran程序编译出来的符号名。
我不知道fortran是否有extern “C”之类的东东。
但是编译fortran程序是有选项可选的。
比如:gcc -fno-underscoring -fcase-preserve -c main.f这里加了两个选项,顾名思义前者用来去掉下划线,后者用来保持大小写。
这下再nm main.oU FOO00000000 T MAIN__U s_stop这样就解决了c函数被fortran调用的问题了。
但是因为main.o中还有一个未定义符号s_stop,而gcc默认只链接和c相关的库,所以这时使用gcc -osample main.o foo.o会报错,大概就是说s_stop未定义(unreferenced 或者 undefined)。
一个简单的解决办法——使用g77链接main.o和foo.o。
就好像gcc默认会链接c库一样,g77默认会链接 fortran的一些基本的,标准的库;另一个办法就是查明g77会链接哪些基本的,标准的fortran库,这也很简单在编译链接fortran程序时加上-v选项。
我看到的g77的比gcc 多了这几个选项 -lfrtbegin -lg2c -lm,那么就是说g77链接了libfrtbegin,libg2c,libm,最后一个是数学库,前两个应该就是g77专用的了。
所以gcc -lfrtbegin -lg2c -osample main.o foo.o(同样g++使用了-lstdc++,也就是libstdc++。
这也就是为什么时常有人问gcc 会出错的问题了,如果用到了c++库中的函数,那么当然要使用gcc -lstdc++ 才行了)如果我们保持main.c不变,而将foo.c变为foo.f。
也就是c 调用fortranc foo.fSUBROUTINE FOO()print *,"hello world"END编译foo.f和main.cgcc -fno-underscoring -fcase-preserve -c foo.fgcc -c main.c链接gcc -lfrtbegin -lg2c(其实,当fortran不为主程序时,可以不用链接libfrtbegin,main.o foo.o -osample成了。
起码这个小程序不用)这里讨论了混编的基本原理,就是让链接器找到符号所在。
从这点出发,一些混编问题都应该有了解决的思路。
至于代参数的函数我没有涉及到,但我想都得从这个基本出发吧。
还有些程序会使用动态链接库.so,那么应该使用nm的-D选项查看这些动态符号。
(objdum的功能比nm更强大)有很多东西很基础我还罗嗦了很久,让大家见笑了:)还有一件事,那就是我这里链接采用了gcc -l的方式,更基本的是ld的方式,只要你知道链接哪些库,链接的顺序如何即可。
但是为了简单安全方便,还是建议直接用相应的编译器完成链接工作(比如 fortran就用g77),因为它们的链接顺序已经理好了(并且它们除了链接自己的库还链接c库,而gcc只链接c库,所以用它们不用担心链不到c库,而用gcc 会担心链不到专有的库)。
像上面的例子最后的链接的使用g77最好,因为我的例子很简单,而你的有可能很复杂。
还想起来一件事,关于网上使用的例子有__stdcall的,那都是关于win api的。