2011-12-09 6 views
1

このコードは、通常の符号付き整数に対してうまく動作します。これは、size_tで動作する同等のバージョンを作成しようとしています。カウントint型があり、私は彼らが)size_t型である必要が:符号なしの値に対してNから0を含むすべての値を反復する

int count,start; 
for (start = (count-2)/2; start >=0; start--) 
{ 
    someFunction(x, start, count); // x is to illustrate function has other parameters 
} 

私はこのコードは本当にシンプルなソリューションのためにまっすぐに十分であるように感じるが、私は空白を描いています。あなたはこのようにそれを書き換えることができ

+0

問題で、宣言を追加してください/開始、カウント&xの初期化。 –

+0

もちろん、問題ありません。 – user1086516

答えて

3

:それ以外の場合は

start = count/2; 
while (start > 0){ 
    start--; 
    someFunction(x, start, count); 
} 

、私は考えることができる唯一の他の選択肢は...符号付きと符号なしの間にいくつかの非標準に準拠し、鋳造を行うのか、~(size_t)0で何かをすることです

for (start = (count-2)/2; (ssize_t)start >= 0; start--) 
{ 
    someFunction(x, start, count); 
} 

for (start = (count-2)/2; start != ~(size_t)0; start--) 
{ 
    someFunction(x, start, count); 
} 
+0

'〜(size_t)0'は' SIZE_MAX 'に等しい。 –

0

何ひとつで値をオフ使用について:...ここで

は、いくつかの非標準に準拠し選択肢がありますか?

size_t start_plus_one; 
for (start_plus_one = (count-2)/2+1; start_plus_one >=1; start_plus_one--) 
{ 
    someFunction(x, start_plus_one-1, count); // x is to illustrate function has other parameters 
} 
0

元のコードから終了条件を修正することができます。 -1/2はC99で0になることが保証されているため、ループ本体が一度実行されるため、型が符号なしでも必要な動作であればcount == 1を特別扱いする必要があります。

size_t count = something; 
if (count > 1) { 
    for (size_t start = (count-2)/2; start != SIZE_MAX; --start) { 
     someFunction(x, start, count); 
    } 
} 

我々は2つの利回りSIZE_MAXで割ったことsize_tの値がないのでstartの初期値はおそらく、SIZE_MAXすることができないことを知っているので、これは動作します。

より一般的なループの場合、SIZE_MAXから開始して0にまで下がる必要がありますが、ループボディの前に終了チェックを実行できないことは明らかです。ループボディをすべての値size_tのように、終了できる値はありません。そのような場合のためにできるようにするには:すべてのケースで

size_t count = SIZE_MAX, start = SIZE_MAX; 
do { 
    someFunction(x, start, count); 
} while (start-- != 0); 

SIZE_MAXは、それがすべてのunsigned型の最大値に変換しますが、confused questionsにつながるという点で、より汎用的である、-1と交換することができます。

1
size_t cnt, start; 
for (start = cnt/2; start-- > 0;) { ... } 
  • CNT = 0の場合:スタート、ループ・コードを実行することはありません、ゼロで開始します。ループの後、startは(size_t)-1
  • cnt = 1の場合:
  • cnt> = 2の場合、ループコードは少なくとも1回実行されます。最初の反復で、startは(cnt/2)-1になります。最後の反復開始時には0になります。ループスタートが

EDITはOPは本当にCNT = 1のために一回ループしたい場合には(size_t)-1になります後、三元は必要です:

for (start = (cnt==1) ? 1 : cnt/2; start-- > 0;) { ... } 
+0

私の解決策と同じように、これは 'count == 1'の場合の質問者のコードと同じことをしません。 –

+0

あなたが正しいと思います。 OPの奇妙なケースをcnt = 1のために一度ループしたい場合は、三項を追加する必要があります。 (私は彼がそれを望むとは思わない)私は更新されます。 – wildplasser