FreeMat v3.5日本語ドキュメント
フロー制御

 

ドキュメント目次

--------------------------------------------------------------------
lasterr 最終エラーの出力

  [構文]

msg = lasterr
lasterr(msg)

 [例] 

--> try; error('Test error message'); catch; end;
--> lasterr

ans =

Test error message
--> lasterr('Test message');
--> lasterr

ans =

Test message

--------------------------------------------------------------------
warning  警告メッセージの生成
警告メッセージの作成

  [構文]

warning(s)
 sは文字列
  [例] 

--> warning('Stop!!')
Warning: Stop!!

--------------------------------------------------------------------
warning  エラーメッセージの生成
  [構文]

 error(s)
 
  [例] 
evenoddtest.m
function evenoddtest(n)
if (n==0)
error('zero is neither even nor odd');
elseif (~isa(n,'int32'))
error('expecting integer argument');
end;
if (n==int32(n/2)*2)
printf('%d is even\n',n);
else
printf('%d is odd\n',n);
end
実行例
--> evenoddtest(4)
4 is even
--> evenoddtest(5)
5 is odd
--> evenoddtest(0)
In base(base) on line 0
In simkeys(built in) on line 0
In Eval(evenoddtest(0)) on line 1
In evenoddtest(evenoddtest) on line 3
Error: zero is neither even nor odd
--> evenoddtest(pi)
In base(base) on line 0
In simkeys(built in) on line 0
In Eval(evenoddtest(pi)) on line 1
In evenoddtest(evenoddtest) on line 5
Error: expecting integer argument

--------------------------------------------------------------------
try TRY-CATCH文 記述
TRY-CATCH文エラーのハンドリングのために使用されます。

  [構文]

 try
statements_1
catch
statements_2
end


最初にstatements_1を実行し、この際エラーが発生するならばstatements_2を実行します。

  [例]

read_file.m

function c = read_file(filename)
try
fp = fopen(filename,'r');
c = fgetline(fp);
fclose(fp);
catch
c = ['could not open file because of error :' lasterr]
end

実行例

--> read_file('this_filename_is_invalid')
In base(base) on line 0
In simkeys(built in) on line 0
In Eval(read_file('this_file...) on line 1
In read_file(read_file) on line 3

c =

could not open file because of error :
No such file or directory for fopen argument this_filename_is_invalid


ans =

could not open file because of error :
No such file or directory for fopen argument this_filename_is_invalid

--> fp = fopen('test_text.txt','w');
--> fprintf(fp,'a line of text\n');
--> fclose(fp);
--> read_file('test_text.txt')

ans =

a line of text


--------------------------------------------------------------------
switch SWITCH文 記述


  [構文]

 switch(expression)
case test_expression_1
statements
case test_expression_2
statements
otherwise
statements
end
  [例] 
switch_test.m

function c = switch_test(a)
switch(a)
case {'lima beans','root beer'}
c = 'food';
case {'red','green','blue'}
c = 'color';
otherwise
c = 'not sure';
end
実行例

--> switch_test('root beer')

ans =

food

--> switch_test('red')

ans =

color

--> switch_test('carpet')

ans =

not sure

--------------------------------------------------------------------

if IF-ELSEIF-ELSE 条件文記述

条件分岐文。

  [構文]

 if conditional_expression_1
statements_1
elseif conditional_expression_2
statements_2
elseif conditional_expresiion_3
statements_3
...
else
statements_N
end
  [例] 
if_test.m
function c = if_test(a)
if (a == 1)
c = 'one';
elseif (a==2)
c = 'two';
elseif (a==3)
c = 'three';
else
c = 'something else';
end

実行例
--> if_test(1)

ans =

one

--> if_test(2)

ans =

two

--> if_test(3)

ans =

three

--> if_test(pi)

ans =

something else


--------------------------------------------------------------------
while WHILE文記述
  [構文]

 while test_expression
statements
end
  [例] 
--> accum = 0;
--> k=1;
--> while (k<100), accum = accum + k; k = k + 1; end
--> accum

ans =

4950


--------------------------------------------------------------------
for FOR文記述
  [構文]

(1)

 for (variable=expression)
statements
end
(2)

 for variable=expression
statements
end
(3)

 for variable
statements
end

  [例]
(1)

--> accum = 0;
--> for (i=1:100); accum = accum + i; end
--> accum

ans =

5050
(2)
--> accum = 0;
--> for i=1:100; accum = accum + i; end
--> accum

ans =

5050

(3)

--> accum = 0;
--> for i=0; accum = accum + i; end
--> accum

ans =
0

--------------------------------------------------------------------
continue CONTINUE文記述
ループ内の実行順序を変更する際に用います。そのためループの文内に記述します。

  [例]

continue_ex.m
function accum = continue_ex
accum = 0;
for i=1:10
if (i==5)
continue;
end
accum = accum + 1; %skipped if i == 5!
end
実行例
本例では、10回ループを回しそのループの数を数えるが変数iが
5の場合はその処理を行わなくする。そのため、カウントは一回減る。
continue_ex.m

function accum = continue_ex
accum = 0;
for i=1:10
if (i==5)
continue;
end
accum = accum + 1; %skipped if i == 5!
end

実行例

--> continue_ex

ans =

9


--------------------------------------------------------------------
break ループのブレーク
ループ処理を抜ける際に使用します。

  [例]

break_ex.m
function accum = break_ex
accum = 0;
i = 1;
while (i<=10)
accum = accum + i;
if (i == 5) %5回目のこの場所でブレークをかける
break;
end
i = i + 1;
end
実行例
--> break_ex

ans =

15



--------------------------------------------------------------------
return 関数からのリターン
関数やキーボードセッションからのリターンです。

  [例]

① 関数からのリターン 
return_func.m

function ret = return_func(a,b)
ret = 'a is greater';
if (a > b)
return;
end
ret = 'b is greater';
printf('finishing up...\n');


実行例

--> return_func(1,3)
finishing up...

ans =

b is greater

--> return_func(5,2)

ans =

a is greater


② キーボードセッションからのリターン

return_func2.m

function ret = return_func2(a,b)
if (a > b)
ret = 'a is greater';
keyboard;
else
ret = 'b is greater';
end
printf('finishing up...\n');
実行例
--> return_func2(2,4)
finishing up...

ans =

b is greater

--> return_func2(5,1)
[return_func2,4]--> ret

ans =

a is greater

[return_func2,4]--> a

ans =

5

[return_func2,4]--> b

ans =

1

[return_func2,4]--> return
finishing up...

ans =

a is greater



--------------------------------------------------------------------
retall キーボードセッションからのリターン
込み入ったキーボードセッションからのリターン。どのレベルからも即座にベースのワークスペースのレベルへリターンします。またデバックの際、特に有益です。

  [例]

本例は、再帰を用いた関数を使用した例です。keyboardコマンドによりプロントが出力します。二度このself.mを実行するとベースワークスペースへ戻るにはreturnコマンドを二回使用しないといけませんが、今回のretallコマンドは一度の実行で、ベースワークスペースへ戻ります。

self.m
function y = self(n)

if (n>1)

y = n + self(n-1);

printf('y is %d \n',y);

else

y = 1;

printf('y is initialized to one\n');

keyboard

end

実行例

--> self(4)
y is initialized to one
[self,8]--> self(6)
y is initialized to one
[self,8]--> retall %本来ならばreturnを2回実行

-->

---------------------------------------------------------------------------------------------
keyboard デバックセッションの開始
k双方向のセッションを開始するために用いられます。

  [構文]

実行
  keyboard
結果
 [scope,n] -->
ここでいうscopeとは現在実行している関数名です。nはキーボード
セッションの深さです。コマンドreturnはキーボードセッションを抜け
プログラムを再開します。またコマンドretallは実行を飛び越しベース
ワークスペースまで一気にリターンします。keyboardはデバック時に
有益です。
 [例]
key_one.m
function c = key_one(a,b)
c = a + b;
keyboard

実行例

本例では、関数を二度実行します。その結果2つの深さになっていることが入力引数の実行などにより、確認できます。ベースワークスペースに戻るにはコマンドreturnを二度実行します。

--> key_one(1,2)
[key_one,3]--> key_one(5,7)
[key_one,3]--> a

ans =

5

[key_one,3]--> b

ans =

7

[key_one,3]--> c

ans =

12

[key_one,3]--> return

ans =

12

[key_one,3]--> a

ans =

1

[key_one,3]--> b

ans =

2

[key_one,3]--> c

ans =

3

[key_one,3]--> return

ans =

3