运行时失败

时间:2012-02-27 20:15:53

标签: c++ openmp

查看代码,问题。

#include <iostream>
#include <cstdio>

bool prime(unsigned long long num);

int main(){
unsigned long long temp;
unsigned long long max = 600851475143;
FILE * fptr;

try{
fptr = fopen("primes.txt","w");

#pragma omp parallel for
for(unsigned long long i = 2; i<max;i++){
    if(prime(i)){
        temp = i;
        fputs(i + ",",fptr);
        //int percent = (int)((float)i)/((float)max);
        //if(percent > 1 && (percent % 10 == 0)){
        //  std::cout << "Percent Complete: " << percent << std::endl;
        //}
    }
}
std::cout << temp << std::endl;
fclose(fptr);
}catch(...){
    std::cout << "Exception!" << std::endl;
}
return 0;
}

bool prime(unsigned long long num){
for(unsigned long long i = 2;i<num;i++){
    if(num%i == 0)
        return false;
}
return true;
}

@gw运行时失败:

运行时失败:

时间失败:

我失败了:

ailure: :

tualQuery在地址%pc的%d字节失败,地址%pery的%d字节失败  对于%d字节,地址%pfailed为%d字节,地址%p,%d字节,地址%pd 地址处的字节数%pbytes at address%pat address%pddress%press%ppnown伪重定位 协议版本%d。

udo重定位协议版本%d。

重定位协议版本%d。

位置协议版本%d。

协议版本%d。

在协议版本%d。

rotocol版本%d。

n%d。 。  未知的伪重定位位大小%d。

nknown伪重定位位大小%d。

udo重定位位大小%d。

o重定位位大小%d。

阳离子位大小%d。

位大小%d。

为什么会发生此运行时故障?我猜它与unsigned long long有关,但我不知道。也尝试没有omp指令和仍然相同的问题。

1 个答案:

答案 0 :(得分:3)

你在这里弄错了:

fputs(i + ",",fptr);

fputs将const char *作为第一个参数。您将整数值'i'添加到const char *“,”值。一旦'i'变大,那么这个表达式i +“,”将指向一个无效的内存块,因为在C ++中没有重载的运算符'+',它将一个整数与一个指向char缓冲区的const指针连接起来

您可以使用sprintf函数:

char buf[256] = {0};
sprintf(buf, "%d, ", i);

或者,简单地说是将字符串直接写入文件的fprintf

另外,我建议您关闭try {..} catch块之外的文件句柄。否则,如果发生异常,您的文件将不会全部关闭