MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(1)

本章教程共分為7篇進行闡述:
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(1)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(2)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(3)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(4)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(5)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(6)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(7)

本系列教程來源于出版書籍《基于MATLAB編程基礎(chǔ)與典型應(yīng)用書籍》念逞,如涉及版權(quán)問題典鸡,請聯(lián)系:156204968@qq.com。 出版社:人民郵電出版社亭敢, 頁數(shù):525畏吓。

本系列教程目前基于MATLABR2006a,可能對于更高級版本的功能和函數(shù)有差異卫漫,教程中如有問題菲饼,請聯(lián)系:156204968@qq.com

MATLAB外部程序接口(API)函數(shù)庫例如MEX函數(shù)庫,MX函數(shù)庫列赎,MAT函數(shù)庫和Engine函數(shù)庫等包含豐富的接口函數(shù)宏悦,利用這些接口函數(shù)可以輕松地實現(xiàn)C,C++,F(xiàn)ORTRAN等語言調(diào)用Matlab命令和數(shù)據(jù)文件饼煞,通過使用C或者FORTRAN語言編寫MEX文件源葫,利用Matlab開發(fā)環(huán)境的MEX編譯命令,可以極大提高M語言程序的運行速度和代碼執(zhí)行效率砖瞧。通過調(diào)用MATLAB引擎息堂,實現(xiàn)后臺MATLAB函數(shù)的調(diào)用。利用MATCOM以及MATLAB環(huán)境下的COM編譯器块促,可以獨立與MATLAB開發(fā)平臺進行應(yīng)用程序開發(fā)荣堰。本章主要內(nèi)容包括以下四個方面:

  • 創(chuàng)建C語言MEX文件
  • MAT文件應(yīng)用
  • MATLAB引擎技術(shù)
  • Visual C++與MATLAB接口

16.1 概述

MATLAB開發(fā)環(huán)境提供了豐富的應(yīng)用接口程序(API)函數(shù)庫包括MAT函數(shù)庫,MEX函數(shù)庫竭翠,MX函數(shù)庫振坚,Engine函數(shù)庫實現(xiàn)與其他工作環(huán)境的接口,提供了不同的編譯命令如MEX命令斋扰,MCC命令等將M文件編譯成獨立與MATLAB工作環(huán)境的動態(tài)鏈接庫文件(DLL)文件渡八,C++語言直接調(diào)用的.cpp,.h文件以及可執(zhí)行.exe文件等传货。通過組件對象模型(COM) 實現(xiàn)將MATLAB工作環(huán)境的M文件和MEX文件封裝為組件屎鳍,在其他兼容COM組件的編譯環(huán)境包括Visual C++,Visual Basic损离,Java等直接進行調(diào)用哥艇。

1. MATLAB編譯器(Compiler)

使用MATLAB Compiler可以將M文件轉(zhuǎn)化為C, C++和MEX文件。首先使用mex –setup和mbuild –setup命令配置MATLAB Compiler的編譯環(huán)境僻澎,使用mcc命令將M文件轉(zhuǎn)化為可獨立與MATLAB開發(fā)環(huán)境的動態(tài)鏈接庫文件(DLL文件)和exe文件貌踏。使用MATLAB自帶的編譯器將M文件轉(zhuǎn)化為Dll文件和exe文件,一方面可以保持MATLAB強大的數(shù)學(xué)運算功能窟勃,同時編譯生成的C, C++代碼祖乳,可以加快程序的運行速度,也可以實現(xiàn)純文本 (Script)的M文件代碼的隱蔽性秉氧。但是使用mcc命令編譯后生成的.cpp文件眷昆,一般程序冗長,代碼可讀性比較差汁咏,但對于應(yīng)用程序使用者而言亚斋,程序代碼是隱蔽的,因此也不太影響應(yīng)用程序的使用攘滩。在讀者充分熟悉MATLA開發(fā)環(huán)境的C/C++數(shù)學(xué)庫的前提下帅刊,讀者可以實現(xiàn)在C++語言中直接調(diào)用MATLAB的C/C++數(shù)學(xué)庫相關(guān)命令,從而優(yōu)化mcc命令自動編譯生成的C漂问,C++程序代碼赖瞒。

2. MATLAB引擎技術(shù)

MATLAB應(yīng)用程序接口(API)同時提供了一組引擎函數(shù)來啟動和調(diào)用MATLAB函數(shù)女揭。通過MATLAB引擎技術(shù),可以兼顧兩方面的優(yōu)點栏饮,一是保持C++編程語言的高效性吧兔,二是可以直接調(diào)用MATLAB豐富的工程應(yīng)用函數(shù),包括復(fù)雜的數(shù)學(xué)分析和信號處理函數(shù)等袍嬉。在一些特定的應(yīng)用場合中境蔼,前臺可以使用C++,C或者FORTRAN語言編寫人機接口界面冬竟,實現(xiàn)前臺的用戶界面接口以及后臺的數(shù)據(jù)通信欧穴,而后臺則使用MATLAB引擎實現(xiàn)復(fù)雜的數(shù)學(xué)分析和信號分析處理功能,這樣可以極大簡化使用C++泵殴,C或者FORTRAN語言編寫復(fù)雜運算函數(shù)的難度涮帘,縮短應(yīng)用程序的開發(fā)周期,同時可以保證應(yīng)用程序具備較高的可靠性笑诅。

3. MAT文件

在MATLAB開發(fā)環(huán)境中调缨,數(shù)據(jù)的存儲通常以一種特殊的二進制文件MAT數(shù)據(jù)文件來進行存儲。與其他語言環(huán)境進行數(shù)據(jù)通信中吆你,也通常使用MAT文件數(shù)據(jù)格式弦叶。在MATLAB應(yīng)用程序接口(API)函數(shù)庫中提供了豐富的接口函數(shù)實現(xiàn)對MATLAB不同格式的數(shù)據(jù)進行讀取和存儲。在其他語言環(huán)境中妇多,可以使用MAT函數(shù)庫伤哺,MEX函數(shù)庫和MX函數(shù)庫相關(guān)函數(shù)進行數(shù)據(jù)文件的操作,從而實現(xiàn)MATLAB語言與外部編程環(huán)境的數(shù)據(jù)接口者祖。

4. MEX文件

MEX文件是一種MATLAB可執(zhí)行的程序文件立莉,通過編寫mexFunction函數(shù)入口,將C七问,C++和FOTRAN等語言的程序代碼嵌入到MEX文件中蜓耻,實現(xiàn)在MATLAB開發(fā)環(huán)境中調(diào)用其他語言程序代碼。使用MEX函數(shù)庫和MX函數(shù)庫械巡,可以實現(xiàn)不同數(shù)據(jù)格式的創(chuàng)建刹淌,賦值和矩陣基本操作,通過MEX命令將M文件直接編譯成動態(tài)鏈接庫文件或者其他MATLAB可直接運行的可執(zhí)行文件讥耗。使用MEX文件有勾,可以直接嵌入其他語言功能程序代碼段,而不需要重新編寫相應(yīng)功能的M文件代碼古程,這無疑為程序代碼的移植和重用提供了一種非常有效而且高效的途徑柠衅。

5. MATCOM實現(xiàn)MATLAB與Visual C++接口

MATCOM是MathTool公司推出的一種MATLAB編譯平臺,可以對MATLAB函數(shù)進行文本編譯籍琳,直接運行菲宴,或者將MATLAB開發(fā)環(huán)境的M文件編譯成.exe文件和.dll文件。當前MATCOM的最高版本是MATCOM4.5版本趋急,可以支持與Visual VC++的混合代碼編譯喝峦。MATCOM提供了Visual MATCOM工具來實現(xiàn)在Visual C++環(huán)境下編譯運行MATLAB的M文件。在Visual C++中啟用Visual MATCOM Add-in插件呜达,可以直接將MATLAB的M文件導(dǎo)入Visual C++環(huán)境中谣蠢,并自動轉(zhuǎn)化為對應(yīng)的.h頭文件和.cpp文件,相比與MATLAB自帶的編譯器(Compiler)而言查近,MATCOM將M文件轉(zhuǎn)化后的.cpp文件簡單易讀眉踱,程序代碼可讀性好。MATCOM同時也提供了自帶的Matrix<LIB>C++數(shù)學(xué)庫霜威,該數(shù)學(xué)庫使用Mm數(shù)據(jù)類型谈喳,包含眾多的數(shù)學(xué)函數(shù),可以實現(xiàn)在Visual C++中使用這些數(shù)據(jù)函數(shù)進行數(shù)學(xué)分析戈泼,信號處理婿禽,圖像處理等,使用Matrix<LIB>的C++數(shù)學(xué)庫進行C++編程大猛,可以極大提高程序代碼效率扭倾。

6. MATLAB COM Builder

MATLAB COM Builder為MATLAB6.5版本后提供的另外一種強大的接口編程方式。COM(Component Object Model)即組件對象模型是微軟公司提出的以組件為發(fā)布單元的軟件開發(fā)技術(shù)挽绩。將不同語言膛壹,函數(shù)封裝為基本的組件,獨立與語言環(huán)境運行唉堪。而MATLAB COM Builder正式基于COM概念而開發(fā)的組件編譯界面模聋。使用MATLAB COM Builder可以把MATLAB環(huán)境中開發(fā)的M文件,MEX文件等編譯為組件巨坊,使之成為獨立的COM對象撬槽,可以被其他支持COM語言的開發(fā)環(huán)境使用,如VC趾撵,JAVA侄柔,VB,Microsoft EXCEL等占调。

16.2 創(chuàng)建C語言MEX文件

MATLAB通過MEX文件可以實現(xiàn)與C暂题,C++和FORTRAN語言的接口,在MATLAB開發(fā)環(huán)境中究珊,非常方便地嵌入C薪者,C++和FORTRAN語言函數(shù)。對于不同的操作系統(tǒng)剿涮,通過MEX編譯命令言津,創(chuàng)建不同文件擴展名的MATLAB可執(zhí)行MEX文件攻人。

16.2.1 MEX文件簡介

MEX文件可以方便實現(xiàn)在MATLAB開發(fā)環(huán)境下直接編寫C, C++或者FORTRAN語言程序,通過MATLAB應(yīng)用程序接口(API)接口函數(shù)悬槽,將文件編譯成可獨立執(zhí)行的應(yīng)用程序或者MATLAB函數(shù)可以直接調(diào)用的MEX程序怀吻,極大提高了計算機應(yīng)用程序代碼的可移植性,代碼的執(zhí)行速度和執(zhí)行效率初婆,極大擴展MATLAB語言的應(yīng)用場合蓬坡。MEX文件主要在以下幾個場合中應(yīng)用:

  • 通過MATLAB應(yīng)用程序接口(API)函數(shù)庫,把用C, C++或者Fortran等程序設(shè)計語言編寫的函數(shù)或者子程序磅叛,編譯成MEX文件后屑咳,在MATLAB工作環(huán)境中直接調(diào)用,而不必重新編寫函數(shù)或子程序?qū)?yīng)功能的M文件弊琴,實現(xiàn)計算機不同語言程序代碼的移植兆龙;

  • 由于MATLAB為解釋性語言,在執(zhí)行M文件的過程中访雪,邊解釋邊執(zhí)行详瑞,執(zhí)行速度慢,因此對于一些計算復(fù)雜臣缀,運算時間長的功能程序代碼坝橡,可以編寫相應(yīng)的C, C++或者Fortran程序,編譯成MEX文件后精置,提高MATLAB程序代碼的運行速度和執(zhí)行效率计寇;

  • 利用MEX文件可以直接編寫硬件驅(qū)動程序,實現(xiàn)與底層硬件設(shè)備的接口脂倦,極大擴展MATLAB開發(fā)環(huán)境的應(yīng)用場合番宁;

MATLAB與外部程序的接口主要通過應(yīng)用程序接口(API)函數(shù)庫來實現(xiàn)。MEX文件編程中使用比較頻繁的函數(shù)庫包括MEX函數(shù)庫和MX函數(shù)庫赖阻。在16.3節(jié)MAT文件的應(yīng)用一節(jié)中蝶押,將詳細介紹MAT函數(shù)庫,在16.4節(jié)MATLAB引擎技術(shù)一節(jié)中火欧,將重點介紹Engine函數(shù)庫棋电。

1. MEX文件的基本結(jié)構(gòu)

首先創(chuàng)建以下簡單的mexSimpleDemo.c文件,放置與Matlab當前的工作路徑下苇侵,同時建立一個同名的mexSimpleDemo.m文件赶盔,以便驗證MATLAB在調(diào)用MEX文件和M文件的優(yōu)先順序。

/*
 * mexSimpleDemo.c
*/

#include "mex.h"
double mexSimpleDemo (double *y, double a, double b);

void mexFunction(int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    //變量聲明
    double *y;
    double m,n;
    
    //輸入輸出參數(shù)個數(shù)檢測
    if (nlhs != 1)
        mexErrMsgTxt("Error: At least one output parameter is required!");
    if (nrhs > 2)
        mexErrMsgTxt("Error: No more than two input parameters");
            
    //獲取輸入變量的數(shù)值大小
    m = mxGetScalar( prhs[0] );
    n = mxGetScalar( prhs[1] );
    
   //獲取輸出變量的指針和建立初始值榆浓。
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
    y = mxGetPr(plhs[0]);
    
    //調(diào)用子函數(shù)
    mexSimpleDemo (y, m ,n);
    
}

//算法子程序
double mexSimpleDemo(double *y, double a, double b)
{
    return *y = (a>b)?a:b;
}

從算法子程序可以看出于未,mexSimpleDemo程序?qū)崿F(xiàn)求解兩個輸入變量的最大值,即max函數(shù)的功能。在Matlab命令行窗口中,輸入以下命令:

>> mex mexSimpleDemo.c

編譯成功后,就可以直接在Matlab命令行窗口中調(diào)用mexSimpleDemo文件:

>> a=mexSimpleDemo(5,3)
a =     
5

為了驗證MATLAB在調(diào)用MEX文件, DLL文件和M文件的優(yōu)先級,在MATLAB當前工作窗口中建立一個同名的mexSimpleDemo.m文件。

function c=mexSimpleDemo(a,b)
if(a>b)
    c = a;
else
    c = b;

通過which命令孵户,可以查看Matlab調(diào)用mexSimpleDemo文件的優(yōu)先順序:

>> which mexSimpleDemo
C:\Program Files\MATLAB\R2006a\work\mexSimpleDemo.mexw32

顯示結(jié)果表明,MATLAB優(yōu)先調(diào)用編譯后的MEX文件秘症,而不是m文件匪凉。從以上簡單的程序?qū)嵗梢钥吹揭话憔帉慍語言MEX文件的基本結(jié)構(gòu),首先頭文件中必須包含mex.h蹬叭,然后是C語言編寫的算法子程序聲明藕咏,在這里可以直接利用C語言編寫程序代碼,將C語言編寫的算法函數(shù)直接移植到MATLAB開發(fā)環(huán)境中秽五。

#include "mex.h"   //mex.h頭文件
double mexSimpleDemo (double *y, double a, double b); //C語言算法程序聲明

使用C語言編寫的MEX文件均以mexFunction命名孽查,輸入?yún)?shù)列表中包括兩個整數(shù)變量和兩個mxArray數(shù)據(jù)結(jié)構(gòu)的指針標量。

void mexFunction(int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])

其中坦喘,輸入?yún)?shù)nlhs和nrhs分別表示輸入?yún)?shù)個數(shù)和輸出參數(shù)個數(shù)盲再;指針plhs和prhs分別指向輸出矩陣和輸入?yún)?shù)矩陣的頭指針。通過mxGetScalar或者mxGetPr來獲取輸入?yún)?shù)和地址瓣铣。在定義程序相關(guān)變量后答朋,需要對輸入輸出參數(shù)列表的變量類型,參數(shù)個數(shù)進行檢測:

if (nlhs != 1)   //輸出變量個數(shù)檢測
        mexErrMsgTxt("Error: At least one output parameter is required!");
    if (nrhs > 2)    //輸入變量個數(shù)檢測
        mexErrMsgTxt("Error: No more than two input parameters");

在C語言MEX文件中棠笑,通過mxGetScalar來獲取輸入變量的數(shù)值梦碗,使用mxGetPr來獲取實數(shù)輸出參數(shù)的指針,需要獲取虛數(shù)的輸出參數(shù)指針時使用mxGetPi函數(shù)蓖救,輸出參數(shù)需要使用mxCreate前綴函數(shù)進行初始化洪规。 在后續(xù)的相關(guān)章節(jié)中,將會詳細介紹C語言編寫MEX文件中常用的相關(guān)函數(shù)循捺。

//獲取輸入變量的數(shù)值大小
    m = mxGetScalar( prhs[0] );
    n = mxGetScalar( prhs[1] );
   //獲取輸出變量的指針和建立初始值斩例。
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
    y = mxGetPr(plhs[0]);

獲取輸入?yún)?shù)數(shù)值和輸出參數(shù)列表的指針后,就可以直接調(diào)用C語言程序:

//調(diào)用子函數(shù)
    mexSimpleDemo (y, m ,n);

2. MEX文件的擴展名類型

在不同的操作系統(tǒng)下从橘,使用MEX命令編譯后的文件擴展名不相同念赶,表13.1所示為不同操作系統(tǒng)平臺下編譯MEX文件后的擴展名。

表16.1 不同操作系統(tǒng)平臺下編譯MEX文件后的擴展名

操作系統(tǒng)平臺 文件擴展名
HP-UX .mexhpux
Linux(32位) .mexglx
Linux X86-64 .mexa64
Macintosh .mexmac
Solaris .mexsol
Windows(32位) .mexw32
Windows X64 .mexw64

3. C語言MEX文件常用函數(shù)

使用MATLAB應(yīng)用程序接口(API)函數(shù)庫編寫MEX文件時洋满,使用比較頻繁的是MEX函數(shù)庫和MX函數(shù)庫晶乔。兩個函數(shù)庫的功能不同,MEX函數(shù)庫主要實現(xiàn)與MATLAB工作環(huán)境進行接口牺勾,例如mexEvalString函數(shù)就可以在MATLAB的命令行窗口中執(zhí)行對應(yīng)的字符串語言正罢,MX函數(shù)庫主要是矩陣操作函數(shù)庫,例如mxGetScalar為獲取參數(shù)數(shù)值驻民,mxCreateDoubleMatrix為創(chuàng)建浮點類型的矩陣等翻具。表16.2和表16.3列出了常用MEX函數(shù)庫函數(shù)和MX函數(shù)庫函數(shù)履怯。在表16.3中,由于MX函數(shù)庫函數(shù)眾多裆泳,相同前綴的MX函數(shù)功能和調(diào)用方法類似叹洲,在這里不一一列出相關(guān)函數(shù)的調(diào)用方法,讀者可以參閱MATLAB的函數(shù)幫助文檔工禾。在下一節(jié)中运提,也會通過實例來具體演示相關(guān)函數(shù)的使用。

表16.2 常用MEX函數(shù)庫函數(shù)

函數(shù)名稱 功能描述
mexCallMATLAB 調(diào)用Matlab函數(shù)
mexEvalString 在Matlab窗口中執(zhí)行字符串命令
mexFunction C語言MEX文件的定義
mexGet 獲取圖形對象特定屬性值
mexGetVariable 將工作窗口中的變量拷貝給定義變量
mexPutVariable 把mxArray臨時變量拷貝到給定的工作窗口中
mexErrMsgTxt 在工作窗口中顯示錯誤信息
mexWarnMsgTxt 在工作窗口中顯示警告信息

表16.3 常用MX函數(shù)庫函數(shù)

函數(shù)名稱 功能描述
mxCalloc 給矩陣分配臨時內(nèi)存空間
mxDestroyArray 釋放臨時分配的內(nèi)存空間
mxGet前綴函數(shù) 獲取變量數(shù)值闻葵,類型民泵,指針等
mxCreate前綴函數(shù) 創(chuàng)建不同數(shù)據(jù)類型的矩陣,向量等
mxIs前綴函數(shù) 數(shù)據(jù)類型槽畔,內(nèi)存空間等判斷函數(shù)
mxSet前綴函數(shù) 設(shè)置變量數(shù)據(jù)維數(shù)栈妆,大小指針等函數(shù)

作者:德特數(shù)據(jù)
聯(lián)系方式:156204968@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厢钧,隨后出現(xiàn)的幾起案子鳞尔,更是在濱河造成了極大的恐慌,老刑警劉巖早直,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寥假,死亡現(xiàn)場離奇詭異,居然都是意外死亡莽鸿,警方通過查閱死者的電腦和手機昧旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祥得,“玉大人兔沃,你說我怎么就攤上這事〖都埃” “怎么了乒疏?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饮焦。 經(jīng)常有香客問我怕吴,道長,這世上最難降的妖魔是什么县踢? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任转绷,我火速辦了婚禮,結(jié)果婚禮上硼啤,老公的妹妹穿的比我還像新娘议经。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布煞肾。 她就那樣靜靜地躺著咧织,像睡著了一般。 火紅的嫁衣襯著肌膚如雪籍救。 梳的紋絲不亂的頭發(fā)上习绢,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音蝙昙,去河邊找鬼闪萄。 笑死,一個胖子當著我的面吹牛耸黑,可吹牛的內(nèi)容都是我干的桃煎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼大刊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了三椿?” 一聲冷哼從身側(cè)響起缺菌,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搜锰,沒想到半個月后伴郁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蛋叼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年焊傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈涮。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡狐胎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歌馍,到底是詐尸還是另有隱情握巢,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布松却,位于F島的核電站暴浦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晓锻。R本人自食惡果不足惜歌焦,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砚哆。 院中可真熱鬧独撇,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至关炼,卻和暖如春程腹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背儒拂。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工寸潦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人社痛。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓见转,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒜哀。 傳聞我的和親對象是個殘疾皇子斩箫,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容