数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal的错误(异常)处理
[打印本页]
作者:
forcal
时间:
2011-8-2 18:11
标题:
极限测试之Matlab与Forcal的错误(异常)处理
这里谈不上是极限测试了,只是还借用这个名称。
: ]+ b+ w2 G4 ~* k$ V5 g
% u) m; v# [! Q* S9 }
我们将通过错误处理检测经过多少次运行某个程序才能运行成功,即:通常程序运行时会出现运行错误,我们要测试一下程序运行多少次才能成功一次。
5 s' ?7 N1 p; ^
7 o u" D- X7 k' V# T
在这个例子中,函数what(n,k)是这样设计的:n为大于1的整数,k为大于1的系数。生成一个长度为n的0~1之间均匀分布的随机数数组a,设m=n*k, mm=n*(k-1)/2,尝试取数组a的每一个元素a[a(i)*m-mm],其中a(i)*m-mm是元素的下标。这样,若元素下标有效,则取值成功,否则将产生一个运行错误。
4 i4 e/ u) N7 X9 M: `
0 r6 j9 v; ` T9 g& P, n
例如:n=10, k=1.1,则m=11, mm=0.5,设生成的随机数如下:
B, D# }1 h% Y- J+ v1 U+ Y; [
0.2, 0.05, 0.97, 0.8, 0.5, 0.7, 0.6, 0.4, 0.3, 0.6
8 Q3 v& d0 ]1 ?4 n1 x1 n* K
第1个数0.2的计算下标为:a(i)*m-mm=0.2*11-0.5=1.7,下标取整后为1,则这个下标是有效的;
; B7 q6 h; a! k* Q" e4 L
第2个数0.05的计算下标为:a(i)*m-mm=0.05*11-0.5=0.05,下标取整后为0,则这个下标是有效的;
. f3 W5 m0 o% q$ b/ Q( S' p. p
第3个数0.97的计算下标为:a(i)*m-mm=0.97*11-0.5=10.17,下标取整后为10,则这个下标是无效的;
- h" O% U8 W& V( [3 A1 h
以此类推。
" s! p2 b! V5 [7 A1 [% f. a: P
" v: _/ u! I5 t1 H
主函数main中有一个循环,不断执行what[100,1.1],然后检测运行错误,若出现运行错误且出错函数名为math:
get,说明是函数what()中的元素下标出错,则清除运行错误,继续循环,直至函数what()运行成功,或者出现非math:
get给出的运行错误(例如,用户终止程序运行产生的运行错误),变量i统计运行了多少次才成功了一次。
' l/ W5 U" s, l
+ c" r. z( H, g# }; N
Forcal程序:
!using["math","string"];
, J4 s/ P2 c, @% G4 o1 P
what(n,k:a,i,m,mm)=
k( x" o- m: x" ?. z( c
oo{a = rand(n,1).reshape()}, m=n*k, mm=n*(k-1)/2,
0 r# y% O) j) P) n' N D- E
i=0, while{i<n, a[a(i)*m-mm], i++};
9 r, z; n/ q$ V2 ^ V! R5 k( [1 Z2 A
) j/ q5 m9 V$ m, Q
main(:i,ErrType,FunName,FunNameLen)=
" A# V8 r r- a y5 w$ F! f" c0 ^
FunName="\[80]", FunNameLen=80,
4 _: I* f/ r: | l) L& ^& G
i=0,
8 b6 _5 u0 i% ^ Q* [' v8 T
while{1,
# _" V# j4 z2 e& U& F! u9 Y
i++,
# G6 h. ^" ] S
what[100,1.1], //这个函数运行时可能返回运行错误
4 K- X _. L q m0 X
geterr(&ErrType,FunName,FunNameLen,0,0,0), //获取Forcal运行错误
1 a9 H. |7 d* I5 y! A# v5 Q
if{!ErrType, break()}, //what正常运行,退出
: ^5 P) s: y9 F0 D$ M, i' s9 p5 k
oo{if{wcscmp[ws(FunName),ws("math::oget")], break()}}, //不是函数math::oget给出的运行错误,退出
9 E# T4 K6 u# s
clearerr() //清除Forcal运行错误
$ ^7 z4 h5 f; X9 | m
},
+ Q0 p( E8 L5 Z/ s) n
i;
复制代码
多次运行,一些可能的结果如下:
9 b9 W* Y/ H9 n* p3 u
1518.
- c& E( u, F0 f' [& S
448.
: f$ Y6 p w) ]& Z: I
1518.
( K/ K5 i. @3 q; [( q
448.
: j' m0 G( Q& O$ k8 h( p
4795.
, Y; a; A5 L( g1 L: Z4 f- `
448.
0 q( u+ {) @; n. V/ Y, i' m4 S5 R
1518.
9 H L3 D2 q1 s% D, I; H, A) z
448.
: f* l7 P% a8 ]; J5 B
1518.
* U7 m c$ w& u0 P
3725.
" B% E! z+ F- H4 ~% f% j {
1518.
8 M# C% U1 A4 ]# u" N- j
448.
8 a0 m u$ u4 X! k* T
2 _0 n% _0 s! q0 w. y
对matlab的异常处理不熟悉,哪位朋友有兴趣给出此例的matlab版本?谢谢!
作者:
刘石秀
时间:
2012-1-10 22:31
新手帮忙顶一下
作者:
alair005
时间:
2012-2-7 12:36
看看,肯定能学到不少东西~!~!~@!~!~!~!~
380801145722368
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5