日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1、引言

最近在開發(fā)一個項目時,已經(jīng)用C語言寫好了主要算法部分,并將主要功能實現(xiàn)部分以函數(shù)形式封裝到了動態(tài)連接庫DLL文件中,但客戶要求提供Matlab調(diào)用DLL函數(shù)的例子,因此,花了點時間研究了下Matlab語言中調(diào)用DLL函數(shù)的方法。

為簡單起見,下面以DLL文件中的一個簡單的函數(shù)調(diào)用為例進行說明(當然是虛構(gòu)的一個函數(shù)了,但也涉及到了常用參數(shù)類型如指針、字符串等的傳遞)。

2、DLL文件中函數(shù)原型說明

本例調(diào)用C語言編寫的DLL文件“MyDll.dll”里的函數(shù)“MyFunc”,這個函數(shù)原型聲明如下:

#define EXPORT extern "C" __declspec(dllexport)
void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status);

該函數(shù)產(chǎn)生一個初始值為x0、間隔為deltx、長度為length的一維數(shù)組y,并給出該數(shù)組的最后一個值lastData和函數(shù)的運行狀態(tài)信息status。從函數(shù)的聲明中可以看出,該函數(shù)中參數(shù)數(shù)據(jù)類型涉及到了“double”類型、“int”類型和“char”類型(字符串類型),在參數(shù)傳遞中也涉及到了值傳遞(x0、deltx、length)和指針(y、lastData、status)傳遞方式,較為復雜。為便于理解,下面給出該該函數(shù)的C語言實現(xiàn)代碼。

/*-------------------------------------------------------------------------------
 *	產(chǎn)生等間隔的數(shù)據(jù)向量并返回數(shù)據(jù)向量的最后一個值和狀態(tài)信息
 *	輸入:	x0--起始值
 *			deltx--數(shù)據(jù)間隔
 *			length--數(shù)據(jù)長度
 *	輸出:	y--產(chǎn)生的向量
 *			lastData--y數(shù)組的最后一個值
 *			status--狀態(tài)信息
------------------------------------------------------------------------------- */

void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status)
{
	 	for (int i=0; i<length; i++)
		{
				y[i] = x0 + i * deltx;
		}
		lastData = y[length-1];

		strcpy(status, "ok!");
}

3、Matlab調(diào)用方法

對于上面的MyFunc函數(shù),在Matlab中調(diào)用主要涉及到了幾個函數(shù)的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函數(shù)的使用,分別實現(xiàn)加載/卸載動態(tài)庫、定義指針變量、調(diào)用函數(shù)等功能。

其Matlab中的調(diào)用代碼如下所示:

clc, clear all
loadlibrary('MyDll.dll','MyDll.h');
libfunctions MyDll -full;

x0 = 0;
deltx = 1.1;
length = 10;
pY = libpointer('doublePtr',zeros(1,length));
pLastData = libpointer('doublePtr', 1.0);
pStatus = libpointer('cstring', '');

[~, ~, status] = calllib('MyDll','MyFunc', x0, deltx, length, pY, pLastData, pStatus);
disp(['y: [', num2str(pY.value), ']']);
disp(['lastData: ', num2str(pLastData.value)])
disp(['status: ', status])

unloadlibrary MyDll

其中,通過代碼“libfunctions MyDll -full;”可以顯示dll文件中所有的函數(shù)信息。

運行結(jié)果如下圖所示:

Matlab如何調(diào)用動態(tài)連接庫DLL文件的函數(shù)?

 

可見,在Matlab中已經(jīng)成功調(diào)用了dll文件中的MyFunc函數(shù)并得到了正確的運行結(jié)果。

4、備注

在使用calllib函數(shù)運行dll文件中的函數(shù)時,當參數(shù)中傳遞字符類型的指針變量(char *)時,其對應的變量如上例中pStatus的值不會改變,必須通過calllib的返回值得到更新后的值。

本文由編碼那些事原創(chuàng),請關(guān)注+轉(zhuǎn)發(fā)+收藏+點贊,帶你一起長知識!

分享到:
標簽:Matlab
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定