错误C3017:OpenMP中的终止测试'对于'声明有不正确的形式

时间:2014-03-31 19:48:26

标签: c++ visual-studio-2012 for-loop parallel-processing openmp

我有一个定义了所有变量的for循环

#pragma omp parallel for
for(long long l = 1; l<=sqrtt; l++) ...

当我使用Visual Studio 2012中的/openmp命令行选项编译它时,它给了我

error C3017: termination test in OpenMP 'for' statement has improper form

我不知道为什么'for' statement has improper form

对于OpenMP的语句,正确是什么?如何将其应用于我的for循环?

2 个答案:

答案 0 :(得分:3)

OpenMP 3.1标准为 for-loop 构造规定了一种非常严格的形式(参见第39页):

for (init-expr; test-expr; incr-expr) structured-block

特别是,test-expr必须如下所示:

var relational-op b
b relational-op var

其中 relational-op <,<=,>,>=之一,而b循环不变与var类型兼容的类型的表达式。

除此之外,您必须确保:

  

相关循环的循环控制表达式的值   对于所有线程,循环结构必须相同   队。

所以,回到你的情况,我会检查sqrtt是一个循环不变量,并为所有线程都有相同的值。

一点注意事项

在C ++ 11之前,

long long在C ++中并不是标准的,例如在SO上查看this question

答案 1 :(得分:3)

我遇到了同样的问题。我有这个:

#pragma omp parallel for
for(int i = 0; i < stop; i++){ 
    //My code
}

然后我发现问题是我的变量stop double ,所以,在我的情况下我需要stop double < / em>,我不得不做一个演员:

#pragma omp parallel for
for(int i = 0; i < (int)stop; i++){ 
    //My code
}

然后一切顺利:)

我希望这可以提供帮助。