<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
以一個簡單的加法器為例,介紹C/C++呼叫Fortran語言DLL的操作過程
首先是加法功能的實現,如下程式碼
!函數功能 兩數相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END
這是一般在fortran環境下執行的常規格式,為了生成dll,並且被C/C++呼叫,對以上程式碼進行編輯修改
!函數功能 兩數相加 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
使用VS軟體,可以通過【檔案】->【新建】建立DLL框架:
在新專案下將編輯好的程式碼新增,編譯連結得到 TESTFOR.dll檔案。
呼叫方式有3種,此處只介紹其中一種顯示呼叫方法,其他方式可參照連結
(7條訊息) 【混合程式設計範例】C/C++呼叫FORTRAN編寫的DLL_fengyhack的部落格-CSDN部落格
首先需要將第一步生成的 .dll 檔案Copy到當前C++所在工程目錄下,並對函數進行宣告
#include<iostream> #include <windows.h> 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 中查詢函數並命名 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; //輸出計算的c FreeLibrary(hLibrary); //釋放Library system("pause"); return 0; }
!函數功能 兩數相加 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 !函數功能 兩個陣列相加 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
#include<iostream> #include<windows.h> 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函數 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]<<"+"<<array2[i]<<"="<< array3[i]<<endl; FreeLibrary(hLibrary); free(array1); free(array2); free(array3); system("pause"); return 0; }
執行結果
到此這篇關於C/C++呼叫Fortran的DLL的文章就介紹到這了,更多相關C++呼叫Fortran的DLL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45