1

タイマーオブジェクトを使用しているときに、 for ループで条件が真である回数をカウントすることについて、この問題があります。そのため、60 秒ごとにこの関数を呼び出すタイマー オブジェクトを設定し、X と Z が 1 に等しいかどうかをデータベースで確認し、何かを実行します。問題は、X と Z の値を毎秒変更する別のプログラムがあるため、X と Z が両方とも 1 になるたびにカウントすることです。カウントが 1、2、および 3 に等しい場合、動作が異なります。実行すると、X と Z が何度も 1 に等しいにもかかわらず、1 以上になりません。以下は私のコードです

a = timer('ExecutionMode', 'fixedRate','TimerFcn', 'func(1)', 'Period', 60);
start(a);


function [x] = func(y)
count = 0;
if x == y && z == y
count = count +1;
if count == 1
    disp('1')
elseif count == 2
    disp('2')
elseif count == 3
    disp('3')  
end
else
disp('same')
end
4

3 に答える 3

2

あなたの主な問題は、count変数が関数ローカルスコープを持っているため、関数が呼び出されるたびに作成され、関数が終了すると破棄されることです。関数の呼び出し間で永続化する必要があります。1 つの可能性は、count変数をグローバルにすることです。

global count;
count = 0;

a = timer('ExecutionMode', 'fixedRate','TimerFcn', 'func(1)', 'Period', 60);
start(a);

function func(y)
global count;
if x == y && z == y
    count = count + 1;
    disp(num2str(count));
else
    disp('same');
end

ifこのコードはまた、さまざまな呼び出しを行った構造体をdispへの 1 回の呼び出しに置き換えますdisp。カウントを出力することが意図されている場合は、これがより良い方法です。

于 2013-03-05T18:11:58.393 に答える
1

最初のifステートメントを終了して閉じていません。したがって、count == 1であり、その後のすべてがx == y && z==yの場合にのみ実行される場合

最初のifステートメントを閉じると、コードが機能するはずです。

if x == y && z == y
  count = count +1;
end
if count == 1
...

また、コードを記述しているため、関数に入るたびにカウントが0にリセットされます。つまり、count = count+1です。常にcount=0 + 1=1になります。

于 2013-03-05T05:41:40.953 に答える
0

関数に入る回数をカウントしたい場合は、カウンター変数を永続化する必要があります。そうしないと、すべての呼び出しでゼロに設定されます。

于 2013-03-05T17:14:39.237 に答える