'无效的控制谓词'使用-fopenmp编译时出错

时间:2016-09-10 07:13:10

标签: c openmp

if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle bundle = intent.getExtras();
            settings = context.getSharedPreferences("settings", context.MODE_PRIVATE);
            SmsMessage[] msgs = null;
            String msg_from;
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                msgs = new SmsMessage[pdus.length];
                if (msgs != null) {
                    for (int i = 0; i < msgs.length; i++) {
                        msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        msg_from = msgs[i].getOriginatingAddress();

使用void random(int M,int a,int c,int *seq,int start,int size) { int i = start; seq[0] = 1; seq[i] = (a * seq[i - size] + c) % M; i += size; } for(int iter = 0;iter < ceil((double)(n/size));iter++) { random(M,a,c,seq,1,1); } -fopenmp编译的循环给出了#34;无效的控制谓词&#34;错误。 怎么解决?

2 个答案:

答案 0 :(得分:4)

显示的代码中没有OpenMP构造,因此使用或不使用-fopenmp进行编译不应影响它。但是如果有[parallel] for构造,那么它将失败,因为ceil()的类型是double,而OpenMP只允许循环中的整数类型。

您必须将ceil()的结果强制转换为整数:

#pragma omp parallel for
for(int iter = 0; iter < (int)ceil((double)n/size); iter++)
{      
   random(M,a,c,seq,1,1);
}

答案 1 :(得分:2)

我已经从您的代码中生成了一个我可以正确编译的示例(我没有 尝试执行它)。

我可以使用以下命令编译它(请注意-lm链接器选项):

gcc -fopenmp <<example_name>>.c -lm

代码是;

#include <math.h>

int n = 1;
int size = 2;
int M, a, c;
int *seq;

void random(int M,int a,int c,int *seq,int start,int size)
{
   int i = start;
   seq[0] = 1;
   seq[i] = (a * seq[i - size] + c) % M;
   i += size;
}

int main()
{
   double iter = 0;
   for(;iter < ceil((double)(n/size));iter++)
   {      
      random(M,a,c,seq,1,1);    
   }
   return 0;
}