查看代码,问题。
#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指令和仍然相同的问题。
答案 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块之外的文件句柄。否则,如果发生异常,您的文件将不会全部关闭