сбой во время выполнения - PullRequest
0 голосов
/ 28 февраля 2012

см. Код, вопрос после.

#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 runtime fail:

сбой во время выполнения:

ошибка времени:

я провал:

ailure: :

Ошибка tualQuery для% d байтов по адресу% pQuery, ошибка для% d байтов по адресу% pery для% d байтов по адресу% pfaililed для% d байтов по адресу% p для% d байтов по адресу% pd байты по адресу% pbytes по адресу% pat address% pddress% press% ppnown псевдоперемещение версия протокола% d.

версия протокола перемещения udo% d.

версия протокола перемещения% d.

версия протокола местоположения% d.

версия протокола% d.

в версии протокола% d.

версия протокола% d.

n% d. , Неизвестный размер псевдоперемещающего бита% d.

неизвестный размер бита псевдоперемещений% d.

Размер бита перемещения udo% d.

o размер бита перемещения% d.

размер катионного бита% d.

размер бита% d.

Почему происходит сбой во время выполнения? Я предполагаю, что это как-то связано с unsigned long long, но я понятия не имею. Также пробовал без директивы omp и все той же проблемы.

1 Ответ

3 голосов
/ 28 февраля 2012

Вы ошиблись здесь:

fputs(i + ",",fptr);

fputs получает const char * в качестве первого аргумента. Вы добавляете целочисленное значение 'i' к значению const char * ",". Это выражение i + «,» будет указывать на недопустимый блок памяти, как только «i» станет больше 0, поскольку в C ++ нет перегруженного оператора «+», который объединяет целое число с указателем const на буфер символов

Вместо этого вы можете использовать функцию sprintf:

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

или просто fprintf, который будет записывать строку прямо в файл

Также я предлагаю вам закрыть дескриптор файла вне блока try {..} catch. В противном случае, в случае исключения, ваш файл не будет закрыт вообще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...