声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3717|回复: 2

[转帖]函数结构与参数传递

[复制链接]
发表于 2005-8-31 11:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近简单整理了一下发过的东西,将大家比较困惑的两个问题,再强调一下。<BR><BR>这个问题我也曾经想过很久很久。就是某个函数的子函数,可能具有复用性,而我又不想改变原来的函数,怎样才能调用这个子函数呢?那就是给每一个函数加一个壳。例如这个函数结构:<BR><BR>function varargout = test_function( varargin ) <BR>% .................... <BR><BR>if nargin == 0 <BR>% 创建界面。<BR>% 即使不创建界面,也可以采用这种函数结构。<BR>figurehandle = test_generatefigurecontent; <BR><BR>% 初始化函数,可以用于创建初始化数据。<BR>test_initfiguecontent(figurehandle); <BR><BR>if nargout &gt; 0 <BR>varargout{1} = figurehandle ; <BR>end <BR><BR>elseif ischar( varargin{1} ) <BR><BR>try <BR>if nargout &gt; 0 <BR>[varargout{1:nargout}] = feval( varargin{:} ) ; <BR>else <BR>feval( varargin{:} ) ; <BR>end <BR>catch <BR>disp( lasterr ) ; <BR>end <BR>end <BR><BR>% ------------------------------------------------------------------------- <BR>function figurehandle = test_generatefigurecontent; <BR><BR>..................................... <BR>handles = guihandles( figurehandle ); <BR>guidata( figurehandle, handles ) ; <BR><BR>% -------------------------------------------------- <BR>function test_initfiguecontent( h ) <BR><BR>handles = guidata( h ) ; <BR><BR>DefaultData = test_GetDefaultData ;<BR><BR>........................................ <BR><BR>% --------------------------------------------------<BR>function DefaultData = test_GetDefaultData ;<BR><BR>DefaultData.ParaName = {'height'; 'width';} ;<BR>DefaultData.ParaKanaName = {'高度'; '宽度';} ;<BR>DefaultData.height = 20 ;<BR>DefaultData.width= 5 ;<BR><BR>% -------------------------------------------------- <BR>function test_Uicontrol_Callback( h ) ; <BR><BR>handles = guidata( h ) ; <BR>........................................ <BR><BR>% return ;<BR><BR>-------------------------------------------------------------------------<BR>如果你要得到test_function里面的默认数据,就可以在其他函数中使用如下调用方式就能够得到:<BR>DefaultData = test_function( 'test_GetDefaultData' ) ;<BR>程序会通过这个转换器进入子函数:<BR>elseif ischar( varargin{1} ) <BR>try <BR>if nargout &gt; 0 <BR>[varargout{1:nargout}] = feval( varargin{:} ) ; <BR>else <BR>feval( varargin{:} ) ; <BR>end <BR>catch <BR>disp( lasterr ) ; <BR>end <BR>end <BR>
回复
分享到:

使用道具 举报

 楼主| 发表于 2005-8-31 11:10 | 显示全部楼层

回复:(moon)[转帖]函数结构与参数传递

这种结构还便于传递参数,同时varargin,varargout的使用,便于定制不同的输入方式。曾经写了一个函数,可以支持3到8个输入参数,实现详细的输入参数定制。<BR><BR>关于参数传递<BR>1. 尽量在内存中提取:方法有三种:① 采用function的varargin和varargout传送,② 存在handle的ApplicationData中,③保存在handles里面。当然还有其他方法。 <BR>2.存在硬盘上,采用save和load。 <BR>3.用全局变量,最次的办法,有时却是最好的办法。 <BR><BR>关于nargin,nargout,varargin,varargout<BR>nargin:输入参数的个数,主要用于两个方面:①判断输入参数的个数,如果输入参数个数不对,可以警告或其他处理;②根据参数个数的不同可以做不同的处理。如: <BR>if nargin == 0 <BR>error; <BR>elseif nargin == 1 <BR>………… <BR>elseif nargin == 2 <BR>………… <BR>else <BR>warndlg( '……‘, ’‘,‘modal') <BR>return ; <BR>end <BR><BR>nargout:输出参数的个数,用法同上。 <BR>varargin:输入参数的总和,保存为cell结构。提取方式如下: <BR>A = varargin{1} ; <BR>B = varargin{2:end} ; <BR>varargout 输出参数。见到的最常见的用法是: <BR>if nargout &gt; 0 <BR>varargout{1} =figurehandle ; <BR>end <BR>
发表于 2005-11-16 14:48 | 显示全部楼层

回复:(suffer)[转帖]函数结构与参数传递

关于handles: <BR>实际上这个handles是MATLAB中GUI编程中最常用的一个句柄管理变量。 <BR>handles的生成:handles = guihandles( figurehandle );将figure中所有对象中“Tag”属性有值的句柄的handle采集在一起。handles是结构名,每个“Tag”域名里保持此对象的句柄。 <BR>handles的保存:guidata( figurehandle, handles );handles将保存在figure对象的“ApplicationData”的一个域名里。 <BR>handles的使用:handles = guidata( h );其中为figure中任意一个对象的句柄。 <BR>handles.SpeechSourceGui可能是一个figure的句柄,“userdata”是一个对象的属性,可以在其中存取任何数据。但是我不怎么用它,一则它只能存一个变量;二则它无法存入变量的名字,很难区分。 <BR><BR>关于feval<BR>feval,首先我们可以把它理解为一个函数转换器。执行到feval时,系统将首先寻找内部函数,如果没有找到,再尝试找外部函数。<BR>feval也是一个函数封装器,在执行时它能够调用某个函数;但是在编译时,又可以不将这个函数编译到当前模块中。<BR>feval还有一个很强大的功能,如果结合了这个函数结构,就可以在函数外部调用一个函数的内部函数或子函数。 <BR><BR>关于setappdata,getappdata<BR>setappdata,将数据保存在对象的“ApplicationData”属性中。<BR>getappdata,从对象的“ApplicationData”属性中提取数据,如果没有定义,就为空。<BR>setappdata和getappdata操作的对象,最好为figure_handle,便于管理和扩展。<BR>Matlab的高级编程和对象控制,将大量使用这两个函数。 <BR><BR>关于function_handle<BR>function_handle在matlab环境下还是可以用的,但是不能支持编译,也就是说无法脱离matlab环境安全运行。在构建程序时,一定要考虑到扩展性,有些在某些条件下属于技术缺陷的方法,尽量不要用。 <BR><BR>关于try...catch...end<BR>昨晚给他们做培训,for和if结构讲了一个小时,下次有时间整理一下。<BR>在函数结构里面用到了try...catch...end结构,这个东西虽然保险,但还是尽量少用。因为它屏蔽了很多警告信息,无法很好的调试程序。 <BR><BR>关于load和save的使用,应该是很简单的。建议你先看帮助,然后随便构造几个变量,倒腾几下就熟了。<BR>也可以去看看我提供的这个例子,里面有比较复杂的数据保存、提取的例子。其中的参数如果load不成功,是可以自我修复的。<BR><BR>这个程序,一共有15个m文件,80几个函数,5000多行代码。包含了一般软件的几大块:界面、参数、算法、仿真、演示等。熟悉GUI的朋友感兴趣的问题都有所涉及:比如参数传递,多个界面的操作,m文件构造复杂界面,存取文件,多个axes,读取图片,显示图片等等。 <BR>
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 10:26 , Processed in 0.060010 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表