数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal的错误(异常)处理
[打印本页]
作者:
forcal
时间:
2011-8-2 18:11
标题:
极限测试之Matlab与Forcal的错误(异常)处理
这里谈不上是极限测试了,只是还借用这个名称。
/ I r1 i8 `* r
- x' T" H7 U& l
我们将通过错误处理检测经过多少次运行某个程序才能运行成功,即:通常程序运行时会出现运行错误,我们要测试一下程序运行多少次才能成功一次。
% z. I5 W9 _' Y5 ]( W: W" y
5 O. w. x' i2 |1 {" W' k- U5 z
在这个例子中,函数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是元素的下标。这样,若元素下标有效,则取值成功,否则将产生一个运行错误。
" \7 [9 S9 D" N$ i
2 c0 }5 [$ \0 U) u6 \ h
例如:n=10, k=1.1,则m=11, mm=0.5,设生成的随机数如下:
* n3 }( h ^; H9 m, o( l
0.2, 0.05, 0.97, 0.8, 0.5, 0.7, 0.6, 0.4, 0.3, 0.6
7 v0 O5 c1 D# W( y- D2 _3 z
第1个数0.2的计算下标为:a(i)*m-mm=0.2*11-0.5=1.7,下标取整后为1,则这个下标是有效的;
" _% M4 V% P) g
第2个数0.05的计算下标为:a(i)*m-mm=0.05*11-0.5=0.05,下标取整后为0,则这个下标是有效的;
2 _; \' {! Z. X) {
第3个数0.97的计算下标为:a(i)*m-mm=0.97*11-0.5=10.17,下标取整后为10,则这个下标是无效的;
* H [* D1 k- a6 z) X* B: o- G
以此类推。
( d: a+ ~ a& V& \& d& r
/ L) ?, j2 L2 m2 G, S6 U. e+ Z/ Y
主函数main中有一个循环,不断执行what[100,1.1],然后检测运行错误,若出现运行错误且出错函数名为math:
get,说明是函数what()中的元素下标出错,则清除运行错误,继续循环,直至函数what()运行成功,或者出现非math:
get给出的运行错误(例如,用户终止程序运行产生的运行错误),变量i统计运行了多少次才成功了一次。
7 U- R: `5 j+ V# i0 I. e
( g: Y: e/ l- D! v' R' H A* l
Forcal程序:
!using["math","string"];
0 n/ c& i/ v# [0 ~/ g- q. w6 q( Z
what(n,k:a,i,m,mm)=
5 A7 o$ K1 F3 `: H1 ]" w5 ]5 I3 E% j
oo{a = rand(n,1).reshape()}, m=n*k, mm=n*(k-1)/2,
3 @8 h1 u* g) P
i=0, while{i<n, a[a(i)*m-mm], i++};
M: |/ S, J7 R, [
/ }2 U# m' D8 ?" `. n$ |
main(:i,ErrType,FunName,FunNameLen)=
' a7 S7 V0 T P' ^" y
FunName="\[80]", FunNameLen=80,
) v- x; M7 B! `
i=0,
9 [1 t1 t/ R2 r) S- L, D5 ]( v
while{1,
' {! W; s8 |( X u7 P
i++,
8 k5 P: m0 g* H9 @
what[100,1.1], //这个函数运行时可能返回运行错误
5 X( t) H4 \# n& f
geterr(&ErrType,FunName,FunNameLen,0,0,0), //获取Forcal运行错误
. Q+ k7 P+ I) {
if{!ErrType, break()}, //what正常运行,退出
3 f9 Y" D& o; P% d7 n$ A
oo{if{wcscmp[ws(FunName),ws("math::oget")], break()}}, //不是函数math::oget给出的运行错误,退出
% n0 G7 N$ c* y& J' |
clearerr() //清除Forcal运行错误
( A |3 L$ s0 C, l
},
0 \; o, m* I6 P( e7 r. ~
i;
复制代码
多次运行,一些可能的结果如下:
, e0 p) ^* R8 X5 E
1518.
F. e& }. h1 W( f/ |
448.
' S, J5 V: t, z" K
1518.
# y- K+ q e0 v6 O! L* Q$ S- j5 }
448.
9 \" Y. N6 b, H3 h& v! @5 z
4795.
7 r: S8 r2 S- U t' `
448.
' S' \8 w6 M$ ~3 ~& L% S! C
1518.
9 S9 P: e9 p1 ]
448.
5 C8 z! F# Q3 e5 x4 P0 t7 s4 f
1518.
" P$ o9 L3 ^3 c& g* f. e
3725.
0 [& ]) c$ Y3 Q( j
1518.
+ r9 x1 e. w- M3 y6 D' i. O) c
448.
: `. Z0 a) ?: Z$ _) W6 {
- L! c1 @% d6 e5 R
对matlab的异常处理不熟悉,哪位朋友有兴趣给出此例的matlab版本?谢谢!
作者:
刘石秀
时间:
2012-1-10 22:31
新手帮忙顶一下
作者:
alair005
时间:
2012-2-7 12:36
看看,肯定能学到不少东西~!~!~@!~!~!~!~
380801145722368
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5