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;错误。
怎么解决?
答案 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;
}