数学建模社区-数学中国

标题: 极限测试之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$ i2 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.67 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程序:
  1. !using["math","string"];
    0 n/ c& i/ v# [0 ~/ g- q. w6 q( Z
  2. what(n,k:a,i,m,mm)=5 A7 o$ K1 F3 `: H1 ]" w5 ]5 I3 E% j
  3.   oo{a = rand(n,1).reshape()}, m=n*k, mm=n*(k-1)/2,
    3 @8 h1 u* g) P
  4.   i=0, while{i<n, a[a(i)*m-mm], i++};  M: |/ S, J7 R, [
  5. / }2 U# m' D8 ?" `. n$ |
  6. main(:i,ErrType,FunName,FunNameLen)=' a7 S7 V0 T  P' ^" y
  7.   FunName="\[80]", FunNameLen=80,) v- x; M7 B! `
  8.   i=0,9 [1 t1 t/ R2 r) S- L, D5 ]( v
  9.   while{1,' {! W; s8 |( X  u7 P
  10.     i++,8 k5 P: m0 g* H9 @
  11.     what[100,1.1],          //这个函数运行时可能返回运行错误
    5 X( t) H4 \# n& f
  12.     geterr(&ErrType,FunName,FunNameLen,0,0,0),  //获取Forcal运行错误. Q+ k7 P+ I) {
  13.     if{!ErrType, break()},  //what正常运行,退出
    3 f9 Y" D& o; P% d7 n$ A
  14.     oo{if{wcscmp[ws(FunName),ws("math::oget")], break()}},  //不是函数math::oget给出的运行错误,退出% n0 G7 N$ c* y& J' |
  15.     clearerr()              //清除Forcal运行错误
    ( A  |3 L$ s0 C, l
  16.   },0 \; o, m* I6 P( e7 r. ~
  17.   i;
复制代码
多次运行,一些可能的结果如下:, e0 p) ^* R8 X5 E
1518.
  F. e& }. h1 W( f/ |448.
' S, J5 V: t, z" K1518.# y- K+ q  e0 v6 O! L* Q$ S- j5 }
448.
9 \" Y. N6 b, H3 h& v! @5 z4795.
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. e3725.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