22

C++/OpenMP コードに次のようなループがあります。

#pragma omp parallel for
for(unsigned int i=0; i<count; i++)
{
    // do stuff
}

(Visual Studio 2005 で) コンパイルすると、次のエラーが発生します。

error C3016: 'i' : index variable in OpenMP 'for' statement must have signed integral type

iが署名ではなく未署名であるためにエラーが発生することを理解しており、署名済みに変更iするとこのエラーが解消されました。私が知りたいのは、なぜこれがエラーなのかということです。符号なしのインデックス変数が許可されないのはなぜですか? このエラーのMSDNページを見ると、何の手がかりも得られません。

4

2 に答える 2

16

OpenMP 2.0 C/C++ API 仕様(pdf) のセクション 2.4.1 によると、これはループforの制限の 1 つです。理由は示されていませんが、範囲が型の最大値をオーバーフローしないようにするための特別なコードがあるため、コードとコンパイラが行う必要がある仮定を単純化するためだと思います。

OpenMP 3.0 では unsigned 型も許可されているようですが、実際の動作はまだ見ていません。

于 2010-05-12T19:21:52.163 に答える