2012-02-27 93 views
-2

看代码,问题之后。运行时间故障

#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失败%d %d个字节的地址%pQuery处的字节失败地址%pery失败 地址%pfailed%d字节地址%p%d地址%d地址%dd 字节地址%pbytes地址%pat地址%pddress%按%%ppnown伪重定位 协议版本%d。

udo重定位协议版本%d。

重定位协议版本%d。

位置协议版本%d。

协议版本%d。

协议版本%d。

rotocol版本%d。

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

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

udo重定位位大小%d。

o重定位位大小%d。

阳离子位大小%d。

位大小%d。

为什么运行时发生故障?我猜它与无符号long long有关,但我不知道。也尝试没有omp指令,仍然是同样的问题。

+7

您的猫是否在键盘上行走?这里发生了什么?你能格式化你的问题吗? – 2012-02-27 20:18:42

+3

@KerrekSB猫有不同的模式......我认为这是一条滑行的蛇 – ScottJShea 2012-02-27 20:22:23

回答

3

你在这里做了一个错误:

fputs(i + ",",fptr); 

的fputs得到为const char *作为第一个参数。您可以将整数值'i'添加到const char *“,”值中。这个表达式i +“,”只要'i'变得大于0就指向一个无效的存储块,因为在C++中没有重载运算符'+',它将一个整型与一个常量指针连接到一个字符缓冲区

您可以使用sprintf函数来代替:

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

,或者干脆fprintf中这将使写入字符串直接将文件

另外,我建议你关闭尝试{之外的文件句柄.. } catch块。否则,在例外的情况下,您的文件将不会被关闭

+0

谢谢你,最终使用sprintf。现在我的电脑几乎没有回应96%的负载哈哈!哦,对于这个问题的方式感到抱歉,那就是文本文件中的结果,它看起来就像那样。 – L7ColWinters 2012-02-27 20:41:46