使用者輸入資料,程式完成資料的插值擬合並以圖形顯示。
在 VC 中設定 MATLAB 函式庫與標頭檔路徑,參考《聯合程式設計 (六)(七)》。
ceshidll.mfunction ceshidll(x,y)
a = min(x):0.1:max(x);
b = interp1(x,y,a,'spline'); % 一維插值
plot(x,y,'*',a,b);
> mcc -t -W libhg:dlltest -T link:lib -h libmmfile.mlib ceshidll.m
參數說明:
-t 將 .m 檔編譯為 C/C++ 程式碼
-W libhg:dlltest 產生使用 C 圖形庫的 DLL,名稱為 dlltest
-T link:lib 產生連結庫
-h 包含所有被呼叫的輔助函數
libmmfile.mlib 連結所需共享函數庫
ceshidll.m 待編譯檔案
編譯完成於 MATLAB 當前目錄產生:ceshidll.c、ceshidll.h、dlltest.c、dlltest.exports、dlltest.h、dlltest.mlib、dlltest.exp、dlltest.lib、dlltest.dll。我們需要 dlltest.h、dlltest.lib、dlltest.dll。
Fit在對話方塊放入一個「擬合」按鈕。

圖 1
將 dlltest.h、dlltest.lib、dlltest.dll 複製到專案目錄,並在 VC 中 Project → Add to Project → Files 加入前兩者。
在 FitDlg.cpp 頂端加入:
#include "matlab.h"
#include "dlltest.h"
#pragma comment(lib, "dlltest")
void CFitDlg::OnButtonFit()
{
UpdateData(TRUE);
double X[100], Y[100];
CString AA, BB, a;
int i = 1;
mxArray *A = NULL, *B = NULL;
AA = m_edit1; BB = m_edit2;
// ... 將字串轉換為數值陣列 X、Y ...
mlfEnterNewContext(0, 0); // 自動記憶體管理
dlltestInitialize(); // 初始化 DLL
mlfCeshidll(A, B); // 呼叫 DLL 函數
mxDestroyArray(A); // 釋放矩陣記憶體
mxDestroyArray(B);
mlfRestorePreviousContext(0, 0);
}

圖 2
本範例實際上仍是呼叫函式庫,無論採用何種介面方式,函式庫都是最底層的實作。建議想精通介面程式設計的開發者熟練掌握 C/C++ 數學函式庫。MATLAB 7.0 對 C/C++ 介面有重大變更,不相容舊版,新版提供類別庫但使用體驗不佳。歡迎交流 (QQ: 44760299)。