網(wǎng)站首頁 編程語言 正文
【混合編程】C/C++調用Fortran的DLL
以一個簡單的加法器為例,介紹C/C++調用Fortran語言DLL的操作過程
一、Fortran操作
1.1 Fortran代碼
首先是加法功能的實現(xiàn),如下代碼
!函數(shù)功能 兩數(shù)相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END
這是一般在fortran環(huán)境下運行的常規(guī)格式,為了生成dll,并且被C/C++調用,對以上代碼進行編輯修改
!函數(shù)功能 兩數(shù)相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END
其中
!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR
也可用以下形式替換
!MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF
1.2 Dll工程文件建立
使用VS軟件,可以通過【文件】->【新建】建立DLL框架:
在新項目下將編輯好的代碼添加,編譯鏈接得到 TESTFOR.dll文件。
二、C / C++調用
調用方式有3種,此處只介紹其中一種顯示調用方法,其他方式可參照鏈接
(7條消息) 【混合編程實例】C/C++調用FORTRAN編寫的DLL_fengyhack的博客-CSDN博客
首先需要將第一步生成的 .dll 文件Copy到當前C++所在工程目錄下,并對函數(shù)進行聲明
#include#include using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c);
在C++工程文件中進行調用
int main(){ //第一步,加載fortran下生成的dll文件 HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); //判斷是否加載成功 if (hLibrary == NULL) { cout << "Cannot open lib" << endl; system("pause"); return -1; } //第二步,從加載的結果 hLibrary 中查找函數(shù)并命名 SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); //判斷是否查找到函數(shù) if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; return -2; //第三步,調用 float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); //調用函數(shù) cout << c << endl; //輸出計算的c FreeLibrary(hLibrary); //釋放Library system("pause"); return 0; }
三、完整代碼
3.1 Fortran代碼部分
!函數(shù)功能 兩數(shù)相加 SUBROUTINE Summator(a,b,c) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF REAL a[VALUE] REAL b[VALUE] REAL c c=a+b END !函數(shù)功能 兩個數(shù)組相加 SUBROUTINE SummatorArray(array1,array2,array3,n) !MS$ATTRIBUTES DLLEXPORT::SUMMATORArray INTEGER n[VALUE] INTEGER i REAL,DIMENSION(n)::array1 REAL,DIMENSION(n)::array2 REAL,DIMENSION(n)::array3 do i=1,n array3(i)=array1(i)+array2(i) end do
3.2 C代碼
#include#include using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c); typedef void(*SUMMATORARRAY)(float *array1, float *array2, float *array3,int n); int main() { //加載dll函數(shù) HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); if (hLibrary == NULL) { cout << "Cannot open dll" << endl; system("pause"); return -1; } SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; return -2; float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); cout << c << endl; SUMMATORARRAY summatorArray = (SUMMATORARRAY)GetProcAddress(hLibrary, "SUMMATORARRAY"); if (summatorArray == NULL) { cout << "Cannot find 'SUMMATORARRAY' function" << endl; int n = 3; float *array1 = (float*)calloc(n, sizeof(float)); float *array2 = (float*)calloc(n, sizeof(float)); float *array3 = (float*)calloc(n, sizeof(float)); for (int i = 0; i < n; i++) { array1[i] = i; array2[i] = i * i; summatorArray(array1, array2, array3, n); cout << array1[i]<<"+"<
運行結果
原文鏈接:https://www.cnblogs.com/GeophysicsWorker/p/16043719.html
相關推薦
- 2022-07-07 python?函數(shù)定位參數(shù)+關鍵字參數(shù)+inspect模塊_python
- 2023-04-01 C++11中強類型枚舉的使用_C 語言
- 2022-11-24 Linux學習之expect操作詳解_linux shell
- 2022-06-22 Android?ViewPager實現(xiàn)頁面左右切換效果_Android
- 2022-08-17 create-react-app常用自定義配置教程示例_React
- 2022-10-13 Python中?whl包、tar.gz包的區(qū)別詳解_python
- 2023-12-20 UML類圖中各箭頭表示總結
- 2023-01-14 python的數(shù)據(jù)與matlab互通問題:SciPy_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支