编者按:这个文件被选为MATLAB中心本周精选
FDEP剖析MATLAB文件并迭代地查找所有用户定义的函数(模块),这些函数(模块)在运行时使用
FDEP为每个模块检索其
- 子功能
- 嵌套函数
- 匿名函数
- eval类调用
——未解决的电话
和所有
- ML库存函数
- ML内置函数
- - - - - - ML类
- - - - - - ML工具箱
它使用
运行时的选项和返回宏创建用户友好的,
直观易懂的交互式gui
-在各种面板和列表框中列出结果
-为每个模块绘制一个完整的大纲
详尽的信息
- 绘制完整的相关性矩阵
-绘制运行时和模块树
在本质上,FDEP为DEPFUN和MLINT一个包装;然而,由于高效的修剪引擎是相当(20-100倍!)快
如果您想要分发函数,那么FDEP特别有用,您可以看看还需要包括哪些函数以及它们使用的工具箱
FDEP对于调试语法正确的错误函数可能很有用
看到
>帮助fdep
以及附带的m文件帮助和一个详尽的例子
美国(2021)。Fdep:一个步行功能依赖查找器(//www.tatmou.com/matlabcentral/fileexchange/17291-fdep-a-pedestrian-function-dependencies-finder), MATLAB中央文件交换。检索.
启发:检测器:一个普通字符串检测器,一个普通的m文件解析器,显示所有使用过的函数的语法
启发:ftoc (v1.2),类似于graphviz的MATLAB工具,DEP(未维护),plot_subfun,plot_depfun
经过额外的测试,我对我之前的文章中的代码修复做了一些改进和bug修复。通过这些修复,fdep几乎完全可以正常工作了,只是没有列出Matlab类依赖项的完整路径,以及注释中描述的其他一些次要项目。
同样,下面的修复应用于fdep。在对mGraphVix.m进行了一个小错误修复后,类似于graphviz的MATLAB工具可以正确地使用fdep。
比较文件。\ DOWNLOADS \ fdep.m和\ SOURCE \ REPOS \ FDEP \ FDEP.M
* * * * * \ \ fdep.m下载
117:DOPT = {
118:“-toponly”
119:“安静”
120:};
* * * * *。\ \回购\ FDEP \ FDEP.M来源
117:DOPT = {
118:“toponly”
119年:};
*****
* * * * * \ \ fdep.m下载801: dmcladd (j + 1:结束)= [];
761:
762: [dtmp dmod dmcl,多克斯,多克斯,多克斯,多克斯,docl] = depfun (fnam, par.dopt {:});% #好吧
763:IM = STRNCMP(par.mlroot,DTMP,numel(par.mlroot));
* * * * *。\ \回购\ FDEP \ FDEP.M来源
760:
761: compleevel0onlyopt = true;
762:如果~ (ismember (par.dopt toponly));compLevel0OnlyOpt = false;结束
763:
764:比较= matlab.depfun.internal.Completion({fnam},matlab.depfun.internal.Target.parse( '无'),compLevel0OnlyOpt);
765: DTMP = {parts(comp).path}';%这也初始化BuiltinListMap。
766:
后续代码期望主函数路径是第一个进入的
768: %。如果main函数不是第一个,那么修复列表
769:如果~ strcmpi (dtmp {1}, fnam)
770:DTMP(strcmpi(DTMP,fnam))= [];
771: DTMP = [fnam; DTMP];
772:结束
773:
774:内建= {};
775:如果retrieveBuiltinListMap(薪酬)。数> 0
776: builtIns = subsref(values(retrieveBuiltinListMap(comp)),substruct('{}',{1}));
777:结束
778:
779: dmod = {};
780: DMCL = {};
781:
782:如果~ isempty(内置)
783: dmod = cellfun(@(x)x. symbol,builtIns,'UniformOutput',false)';
784: dmcl = cellfun(@(x)matlab.depfun.internal.MatlabSymbol.basename(x. qsymbol),builtIns,'UniformOutput',false)';
785: ixbic = ismember(dmcl,matlab.depfun.internal. requirementsconstants . matlabbuiltclasses);
[] = [];%只保留内置类名的成员
787:结束
788:
789:depgraph = getDependencyGraph(COMP);
790:
791:如果depgraph。VertexCount > 1
792: dmcladd = cell(depgraph.VertexCount,1); / /显示数据
793: j = 0;
794: for I = 0:depgraph。VertexCount-1
795:如果depgraph.vertex .Data.symbol(我)。类型= = matlab.depfun.internal.MatlabType.BuiltinClass
796: j = + 1;
797: dmcladd{j} = depgraph.vertex(i).Data.symbol.Symbol;
798:结束
799:结束
800:如果j
802:结束
803: DMCL = [DMCL; dcladd];
804:结束
805:
806: DMCL =唯一(DMCL);部分重新实现的Matlab类列表。完全的重新实现将包括完全
807:路径解决。
808:
809: docx = cell(dtmp);尚未重新实施。与dtmp相同的长度。如果第一个入口是主要的功能,mai
810: n函数被标记为递归。这是'docx'信息的唯一用途。
811: docl = {};尚未重新实施。这只用于识别外部类型的类,例如Java, . net。
812:
813:IM = STRNCMP(par.mlroot,DTMP,numel(par.mlroot));
*****
* * * * * \ \ fdep.m下载
776:
777: dtmp {1} = fap.wnam;
778:如果fap.mp (1)
* * * * *。\ \回购\ FDEP \ FDEP.M来源
826:
827: dtmp {1} = fap.wnam;第一个途径必须是当前的乐趣
828:如果fap.mp (1)
*****
* * * * * \ \ fdep.m下载
2672: par.rexcmp ='(?<='').*(?='')|(?<=(\ \ d s)) +(?=(\.)$)';
2673: par.rexcyc='The McCabe complexity of';
2674:par.rexeva = '(^ feval $)|(^ EVALC $)|(^ evalin $)|(^ EVAL $)';
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2722: par.rexcmp ='(?<='').*(?='')|(?<=(\ \ d s)) +(?=(\.)$)';
2723:par.rexcyc = '的麦凯布';%对于一个脚本,该读取McCabe的圈复杂......对于一个功能,这
2724:读取“[函数名称]”的麦凯布复杂...
2725: par.rexeva = '(^函数宏指令$)| (^ evalc $) | (^ evalin $) | (^ eval美元);
*****
* * * * * \ \ fdep.m下载
2890:如果任何(第九)
2891:CYC =正则表达式(CYC(ix)中,par.rexcmp, '匹配');
2892:赛克=[幕布{}):';
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2941:如果任何(第九)
2942:赛克= regexp (par.rexcmp幕布(ix),“比赛”);
2943:赛克= cellfun (@ (x) fill_empty_fcnname_with_mfilename (x, par.wnam),幕布,UniformOutput,假);
2944:CYC = [CYC {:}]';
*****
* * * * * \ \ fdep.m下载
2936:结束
2937:功能[P,参数] = FARG_get_calls(P,PAR)
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2988:结束
2989:
2990:函数infoCell = fill_empty_fcnname_with_mfilename(infoCell,filepath)
2991:如果长度(infoCell) = = 1
2992: infoCell = {",infoCell{1}};
2993: [~, infoCell{1}, ~]=fileparts(filepath);
2994:结束
2995:结束
2996:
2997:函数[p, par] = FARG_get_calls (p,票面价值)
*****
* * * * * \ \ fdep.m下载
3238:如果有(ix) %
3239:nfmt(IX)= par.lint.cyc(:,2);
3240: else % SCRIPT
* * * * *。\ \回购\ FDEP \ FDEP.M来源
3298:如果任何(IX)%FUNCTION
3299: nfmt (ix) = par.lint.cyc(第九,2);
3300: else % SCRIPT
*****
虽然defun被删除了,但使defun工作的内部Matlab依赖项没有被删除。做以下更改将使这个工具主要是功能性的(减去Java类依赖和'调用'信息)。注意,这些修复还没有经过广泛的测试。
比较文件。\ DOWNLOADS \ fdep.m和\ SOURCE \ REPOS \ FDEP \ FDEP.M
* * * * * \ \ fdep.m下载
117:DOPT = {
118:“-toponly”
119:“安静”
120:};
* * * * *。\ \回购\ FDEP \ FDEP.M来源
117:DOPT = {
118:“toponly”
119年:};
*****
* * * * * \ \ fdep.m下载
761:
762: [dtmp dmod dmcl,多克斯,多克斯,多克斯,多克斯,docl] = depfun (fnam, par.dopt {:});% #好吧
763:IM = STRNCMP(par.mlroot,DTMP,numel(par.mlroot));
* * * * *。\ \回购\ FDEP \ FDEP.M来源
760:
761: compleevel0onlyopt = true;
762:如果~ (ismember (par.dopt toponly));compLevel0OnlyOpt = false;结束
763:
764: comp = MATLAB .depfun.internal. completion ({fnam}, MATLAB .depfun.internal. target .parse('MATLAB'), compleevel0onlyopt);
765: DTMP = {parts(comp).path}';%这也初始化BuiltinListMap
766:
767: builtIns = {};
768:如果retrieveBuiltinListMap(薪酬)。数> 0
769: builtIns = subsref(values(retrieveBuiltinListMap(comp)),substruct('{}',{1}));
770:结束
771: dmod = {};
772:DMCL = {};
773:
774:如果~ isempty(内置)
775:DMOD = cellfun(@(X)x.Symbol,建宏, 'UniformOutput',假)';
776: dmcl = knownClasses(builtIns{1}.classList)';
777:结束
778:
779: docx = {};尚未重新实施
780: docl = {};尚未重新实施
781:
782: im = strncmp (par.mlroot、dtmp元素个数(par.mlroot));
*****
* * * * * \ \ fdep.m下载
814:结束
815:如果~ isempty(多克斯{1})
816: par.spec (tenum.R) = 1;R %规范:
* * * * *。\ \回购\ FDEP \ FDEP.M来源
833:结束
834: if ~isempty(docx) && ~isempty(docx{1})
835: par.spec (tenum.R) = 1;R %规范:
*****
* * * * * \ \ fdep.m下载
2672: par.rexcmp ='(?<='').*(?='')|(?<=(\ \ d s)) +(?=(\.)$)';
2673: par.rexcyc='The McCabe complexity of';
2674:par.rexeva = '(^ feval $)|(^ EVALC $)|(^ evalin $)|(^ EVAL $)';
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2691: par.rexcmp ='(?<='').*(?='')|(?<=(\ \ d s)) +(?=(\.)$)';
2692: par.rexcyc='The McCabe ';%对于一个脚本,该读取McCabe的圈复杂......对于一个功能,这
2693: read The McCabe complexity of '[function name]'…
2694: par.rexeva = '(^函数宏指令$)| (^ evalc $) | (^ evalin $) | (^ eval美元);
*****
* * * * * \ \ fdep.m下载
2890:如果任何(第九)
2891:CYC =正则表达式(CYC(ix)中,par.rexcmp, '匹配');
2892:赛克=[幕布{}):';
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2910:如果任何(第九)
2911:CYC =正则表达式(CYC(ix)中,par.rexcmp, '匹配');
2912:赛克= cellfun (@ (x) fill_empty_fcnname_with_mfilename (x, par.wnam),幕布,UniformOutput,假);
2913:赛克=[幕布{}):';
*****
* * * * * \ \ fdep.m下载
2936:结束
2937:功能[P,参数] = FARG_get_calls(P,PAR)
* * * * *。\ \回购\ FDEP \ FDEP.M来源
2957:结束
2958:
2959:函数infoCell = fill_empty_fcnname_with_mfilename(infoCell,filepath)
2960:如果长度(infoCell) = = 1
2961: infoCell = {",infoCell{1}};
2962: [~, infoCell{1}, ~]=fileparts(filepath);
2963:结束
2964:结束
2965:
2966:函数[p, par] = FARG_get_calls (p,票面价值)
*****
* * * * * \ \ fdep.m下载
3238:如果有(ix) %
3239:nfmt(IX)= par.lint.cyc(:,2);
3240: else % SCRIPT
* * * * *。\ \回购\ FDEP \ FDEP.M来源
3267:如果有(ix) %函数
3268: nfmt (ix) = par.lint.cyc(第九,2);
3269: else % SCRIPT
*****
应该收回,以免浪费时间。
应该收回,以免浪费时间。
我很抱歉告诉你这个坏消息。在v2016a中从MATLAB中删除了DEPFUN函数(FDEP所需)。
开发者注意:请将“发布兼容性”改为v2016a之前的MATLAB版本。看起来这对我来说是一个非常有用的程序。
R2019B错误
R2017b错误
你能告诉我如何解决这个depfun调用详情请?
我尝试用matlab.codetools.requiredFilesAndProducts替换depfun调用。下载188bet金宝搏然而,它仍然不起作用!
这需要更新为R2014b+通过替换depfun调用matlab.codetools.requiredFilesAndProducts。下载188bet金宝搏
如果有人为最新的matlab做一个修复将是伟大的。现在它抛出一个关于depfun()用法的错误。
令人难以置信的,有我在五年前知道这个工具的存在,我会救了很多头痛的问题。
谢谢你!
克莱顿楚,
是的,但是“只是替换函数名”的方法是行不通的。
R2015a仍然只显示一个警告,但是R2015b已经抛出了一个错误
:(
这需要更新为R2014b+通过替换depfun调用matlab.codetools.requiredFilesAndProducts。下载188bet金宝搏
太好了。很多谢谢!
为什么我没有找到以前呢?一个美妙的节省时间的工具。
上帝啊,这个功能太神奇了!万岁!
非常有用的工具!
然而,在最新版本的2010年6月20日,最大允许M-file-name的类文件(脚本和功能都ok)为40个字符!对于较长的文件名,FDEP会产生令人费解的错误信息:
赋值A(:) = B时,A和B中的元素个数必须相同。
我花了一些时间才弄明白……不幸的是,除了使用更短的类名,我目前没有其他解决方案。这似乎与depfun无关。
有什么建议?
速度远远超过depfun,像20倍。谢谢。
但是它似乎不返回.fig文件。
(也有问题的文件)
这是一个很棒的工具!
不过,我也需要得到每个函数调用的文件(行列)中的位置。是否可以 ?如果是的话,你能告诉我该怎么办呢?
你好,
Fdep导致模式上的错误。UDD包中使用的m文件。
谢谢你的伟大贡献!
神奇的!它还列出了实际使用的工具箱,这一点非常宝贵
这是一个非凡的工具!我一直在使用depfun,这是一个更好的工具。谢谢你!
奇妙的工具!它帮助我找到了需要未授权工具箱的功能。
我注意到一件事,想和大家分享一下:
Fdep()和底层的depfun()不解释“常量条件”分支,也就是说,当你有
如果1
Foo ();
其他的
Bla ();
结束
它列出了两种功能。在我的情况,这导致的情况是MATLAB抱怨非授权工具箱 - 这是我没有用。注释掉bla(下)解决了这个问题。:)
非常有用的工具,而且快!
它对我来说工作得很好,除了一个问题:如果输入函数调用subfun。M仅从匿名函数内部,那么fdep()找不到它。
换句话说,如果我的乐趣。M有直线
Sfunc = @(X)subfun(X);
X =兰特;
y = Sfunc (x);
那么对于p=fdep('myfun'), p.fun不包含subfun.m
在此之前,因为我倾向于使用匿名函数的别名很多,例如FAB = @(C,d)F(A,B,C,d)
哇!聪明的和快速的。强烈推荐!谢谢你!
正是我所需要的
非常有用和快速。
伟大的功能。省时省力。比我在20分钟后被迫退出的defun快多了。
这是一个很棒的函数,我已经用了很多年了。但是,gui不能很好地与多个显示器一起使用。因为GUI的不同部分使用了标准化和绝对单位,所以简单地在渲染后调整整个东西的大小并不是理想的(我只是偶然地发现,在我使用它的所有时间里,在右上角有一些我从来不知道存在的按钮)。如果我能告诉它该使用屏幕的哪个部分就好了(即使我必须在自己的版本中硬编码,但现在这似乎需要在代码中更改几行,我还没有全部跟踪它们)。
哇!这是一个伟大的工具!
优秀的工具,更快,比DEPFUN更多的信息。
一个特别有用的功能是检测未解决的函数调用,而DEPFUN似乎没有做到这一点。每个模块的梗概都有一个未解析名称列表,但我无法找到一种方法来获得所有未解析名称的单个列表,除非通过浏览。
你可能也想关掉乳胶解释在相关矩阵的点标签(1921年线,我认为)。
干得好!
你好,我有一些问题使用fdep在一个脚本/函数调用函数是集合的一部分。
例如fdep(“myfunction”、“m”)
在哪里
函数[X] = myFunction的(y)的
X = mycollection.getX(Y);
结束
有开关来捕捉这个吗?
谢谢
乔恩
这是太棒了!我的工作需要使用/调试别人写的代码,这是非常有用的。感谢易于导航,干净,编写良好的代码:)
神奇的!
(继续我之前的错误报告)。在跟踪我之前报告的错误之后,我注意到以下几点:
错误发生在:
ixb (1: par.mfun, 1) =找到(ixt (: 1) = = 1);
(? ?下标赋值维度不匹配。)
这是因为
K > > par.mfun
ans =
32
K>> nummel (find(ixt(:,1) == 1)))
ans =
41
当在使用IBM的CPLEX的函数上运行fdep时,我得到以下错误
26日7:| cplexbilp P 1: C: \ ILOG matlab \ CPLEX_Studio_AcademicResearch122 \最大化策略\ \ x64_win64 \ cplexcreateprob.p
1: C: ILOG\CPLEX_Studio_AcademicResearch122\cplex\matlab\x64_win64\cplexoptimset.p
28 9: | cplexoptimset P 1: C: ILOG\CPLEX_Studio_AcademicResearch122\cplex\matlab\x64_win64\@Cplex\ cplex . P
???下标赋值维度不匹配。
Error in ==> fdep>FARG_get_entries at 3066
ixb (1: par.mfun, 1) =找到(ixt (: 1) = = 1);
错误在==> fdep>farg在2585
[p, par] = FARG_get_entries (p,票面价值);
Error in ==> fdep>FDEP_get_fun at 770
前受奖人fap [fa] = (fnam ' s ', ' - d ');
Error in ==> fdep>FDEP_get_dep at 664
[p par dtmp, dmlf dmod, dmcl, docl] = FDEP_get_fun (p, par, fnam frot);
错误在==> fdep>FDEP_get_dep在740
[p, par] = FDEP_get_dep (p par dtmp{我});
知道为什么会这样吗?
非常有用的。是否可以同时处理…的评论?
% ToDo-things吗?
灿烂的!这个工具给我留下了深刻的印象,特别是,就像其他人评论的那样,比depfun的速度更快。您知道它是否能与新的(略)用户类定义一起工作吗?
好吧,我真是太蠢了。对不起。这个软件太棒了!
非常感谢,总的来说它工作得很好!不幸的是,我必须分析一个基于gui的软件项目,而fdep似乎只考虑自动调用的函数。例如,由于用户输入而被调用的子模块不会被分析。那是正确的吗?
如果是,我能做什么?我真的需要找出,在我最近“继承”的一个相当令人困惑的项目中涉及到哪些工具箱。
安德鲁
不幸的是:不…
原因为何.EVAL之一。组由FDEP单独收集并且如果任何这样的构建体被发现显示一个警告标志...
那么,哪一个是人们应该遵守这些规则的原因之一呢
-不要使用EVAL
-仅在函数句柄中使用FEVAL
注意:
函数宏指令(@sind 30)
将正确找到调用SIND ...
对不起
我们
fdep是否能够找到feval调用,其中feval中的函数名参数本身是一个字符串变量?
例如
函数宏指令(帧,1、2、3)
托马斯。
谢谢你的评论
为了实现你需要的,你可以这样做
页= fdep(“yourmain”);
%,
pp.sub.M
%是一个数组,列出了所有模块及其完整路径
%你可以简单地创建一个小工具,它执行的副本,比如
函数copymod (pp、newfolder)
%错误检查等遗漏…
因为我= 1:pp.nfun
拷贝文件(pp.sub (i)。m, newfolder);
结束
结束
我们
这是奇妙的。它在一个包含184个函数的matlab程序上工作得很快。另外一个有用的功能是在fdep中有一个选项,可以将所有非工具箱依赖项复制到当前工作目录,不过我认为我可以根据P结构中提供的信息自己编写这个选项。谢谢我们。
我觉得这个工具真的很有用。
奥列格
谢谢你的评论
有两个原因
1)一个MODULE是一个M-file/-script,并且是第一个(主)函数
只是这个文件中的另一个(子)函数吗
2)第一个函数应该(!)有相同的
命名为m文件(否则,mlint抱怨);这是一个简单的
为用户进行完整性检查
另外,请注意面板中的第一个字符
米 (...) ...% <-主要功能
年代 (...) ...% <-第一个(官方)子函数
年代 (...) ...% <-等等
我们
这个包很棒,但我不明白为什么主函数被列在子功能窗格(或在'sub. s.n fn'):
函数foo
结束
函数foo2
结束
我只期望foo2的在那里。什么道理呢?
Tnx
优秀的功能!
不过,在Windows中,output.froot中的文件分隔符指向错误的方向。这是故意的吗?
嗨,德克
对增强的伟大建议!
我内置的辅助功能,它您需要的是什么,如果你想将其通过电子邮件发送给你...
一旦我能拿到它,它就会成为FDEP的一部分。
我们
感谢这个神奇的工具。与defun相比,它的速度是惊人的。
不过有一个功能我还不太清楚:
Fdep让您可以很容易地从代码中的_somewhere_中确定使用了哪些工具箱。但不幸的是,要确定是哪个.m文件导致了这个工具箱依赖关系并不容易。
比如,在列表视图中选择一个工具箱,这样就可以突出显示直接依赖于所选工具箱的所有模块。
贾森
是的,这是由设计...
虽然它可以很容易地改变,但它也(潜在地)会导致不希望的结果……
因此,要将一个文件夹中的文件用FDEP保存,而该文件夹不在ML的路径中,则必须CD到该文件夹中……
但是,让我知道这对你来说是一个真正的问题,因为它当然可以改变…
我们
既然它看起来功能齐全,为什么这个函数不能接受完整的路径名呢?
fdep(“C: \ \ \废话\ file.m ")
我得到一个错误说“文件未找到”。它似乎只对当前目录或MATLAB路径中的文件有效。
我非常喜欢以前的版本!非常感谢。
最新版本有一个bug。如果分析一个密封的类(例如定义为"classdef (sealed) MyClass"),程序在fdep中在2928行崩溃。如果“(Sealed)”被删除,程序就会像广告中说的那样工作。
与最新版本(08君2009年22:24:13 / R14-R2009a),每艾萨克森的错误消息不显示了?
原因是一个旧的解析器引擎,它不能处理较新的函数结构……
谢谢你提醒我这个问题…
我们
这是一个伟大的想法,以伟大的方式实现!
全面的用户fraindly和有用的功能。
伟大的工作。
很好。谢谢你分享这个非常有用的
伟大的功能!很有用。是否有可能也看到一个包所需的其他文件,如垫子,TXT,INI等?
我刚下载下来,看起来很不错。然而,我希望你修复错误,它是定位错误的模块。我有一个主模块,它调用8个其他模块,其中7个和主模块在同一个文件夹中。然而,模块#2你列出的名字与我碰巧在另一个文件夹中有一个相同。我不知道你们为什么先看到这个,MATLAB没有,它看到并运行一个正确的,在主模块中。例如,在folder1中,我有m文件myFile和mySubFile1, mySubFile2等。但在folder2中,还有一个mySubFile1这是程序找到的,而不是folder1中的mySubFile1。
关于列表GUI的更多建议:
1.将[John D']按钮替换为滚动条或两个小按钮来增加或减少字体大小。
2.我也想在你的6个按钮上看到工具提示(马上,有些按钮的作用并不明显)。
3.我希望从GUI开始,而不是两个步骤的命令行过程。
4.图像处理工具箱被不正确地称为在工具箱列表框的“图像”。
5.一个比简短而神秘的“fdep”更长的、更具描述性的名称会更好。“行人”和它有什么关系?需要这个词吗?
以下是MATLAB对我的工具箱的报告:
MATLAB版本7.7(R2008b)
图像处理工具箱版本6.2 (R2008b)
MATLAB Builder NE版本3.0 (R2008b)
MATLAB编译器版本4.9 (R2008b)
信号处理工具箱版本6.10 (R2008b)
工具箱EXAMPLE_SCRIPTS版本1.0.0
这是我对一个好项目的看法。
安德鲁,你能和我联系吗?不幸的是,您没有提供电子邮件地址。
当使用mex文件时,它会崩溃。
为了让FDEP适应JD的视力,我们刚刚上传了一个升级版本
1)糖果色被移至零(仍然希望他们能够快速地将不同的面板组合在一起)
2)添加了JOHN D'按钮;它的帮助部分说:
这是为了纪念约翰·德埃里科,一位最受尊敬的长者
FEX和CSSM贡献者,视力很差
点击该按钮将增加字体大小1点每次
版本标签是07- 11 -2007 21:10:00
我们
与往常一样,从我们一个功能齐全,完全能够工具。做得好。
我有一个评论——我的眼睛有点老了,在图形界面的小字体和配色方案上有点困难。色彩柔和的文字在柔和的背景上很难阅读。是时候给我的眼镜配个新处方了?
极大的帮助,的确!此外,作者在愉快的电子邮件交流后很快添加了一个新功能。
哇!