2012-02-27 212 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