开发者

Exit code 3 (not my return value, looking for source)

Greetings,

my program exits with the code 3. No error messages, no exceptions, and the exit is not initiated by my code.

The problem occurs when I am trying to read extremely long integer values from a text file (the text file is present and correctly opened, with successful prior reading).

I am using very large amounts of memory (in fact, I think that this might be the cause, as I am nearly sure I go over the 2GB per process memory limit). I am also using the GMP (or, rather, MPIR) library to multiply bignums. I am fairly sure that this is not a file I/O problem as I got the same error code on a previous program version that was fully in-memory.

System:

MS Visual Studio 2008

MS Windows Vista Home Premium x86

MPIR 2.1.0 rc2

4GB RAM

Where might this error code originate from?

EDIT: this is the procedure that exits with the code

void condenseBinSplitFile(const char *sourceFilename, int partCount){
//condense results file into final P and Q
std::string tempFilename;
std::string inputFilename(sourceFilename);
std::string outputFilename(BIN_SPLIT_FILENAME_DATA2);
mpz_class *P = new mpz_class(0);
mpz_class *Q = new mpz_class(0);
mpz_class *PP = new mpz_class(0);
mpz_class *QQ = new mpz_class(0);
FILE *sourceFile;
FILE *resultFile;

fpos_t oldPos;
int swapCount = 0;
while (partCount > 1){
    std::cout << partCount << std::endl;
    sourceFile = fopen(inputFilename.c_str(), "r");     
    resultFile = fopen(outputFilename.c_str(), "w");
    for (int i=0; i<partCount/2; i++){
        //Multiplication order:
        //Get Q, skip P
        //Get QQ, mul Q and QQ, print Q, delete Q
        //Jump back to P, get P
        //Mul P and QQ, delete QQ
        //Skip QQ, get PP
        //Mul P and PP, delete P and PP

        //Get Q, skip P
        mpz_inp_str(Q->get_mpz_t(), sourceFile, CALC_BASE);
        fgetpos(sourceFile, &oldPos);
        skipLine(sourceFile);
        skipLine(sourceFile);

        //Get QQ, mul Q and QQ, print Q, delete Q
        mpz_inp_str(QQ->get_mpz_t(), sourceFile, CALC_BASE);      
        (*Q) *= (*QQ);
        mpz_out_str(resultFile, CALC_BASE, Q->get_mpz_t());
        fputc('\n', resultFile);
        (*Q) = 0;

        //Jump back to P, get P
        fsetpos(sourceFile, &oldPos);
        mpz_inp_str(P->get_mpz_t(), sourceFile, CALC_BASE);

        //Mul P and QQ, delete QQ
        (*P) *= (*QQ);
        (*QQ) = 0;

        //Skip QQ, get PP
        skipLine(sourceFile);
        skipLine(sourceFile);
        mpz_inp_str(PP->get_mpz_t(), sourceFile, CALC_BASE); 
        //Mul P and PP, delete PP, print P, delete P             
        (*P) += (*PP);
        (*PP) = 0;
        mpz_out_str(resultFile, CALC_BASE, P->g开发者_运维问答et_mpz_t());
        fputc('\n', resultFile);
        (*P) = 0;
    }
    partCount /= 2;

    fclose(sourceFile);
    fclose(resultFile);

    //swap filenames
    tempFilename = inputFilename;
    inputFilename = outputFilename;
    outputFilename = tempFilename;
    swapCount++;
}

delete P;
delete Q;
delete PP;
delete QQ;

remove(BIN_SPLIT_FILENAME_RESULTS);
if (swapCount%2 == 0)
    rename(sourceFilename, BIN_SPLIT_FILENAME_RESULTS);
else
    rename(BIN_SPLIT_FILENAME_DATA2, BIN_SPLIT_FILENAME_RESULTS);
}

EDIT2: completely in-memory version that also exits with 3

void binarySplitE(const ULONG first, const ULONG last, mpz_class *P, mpz_class *Q){
//P(first, last) = P(first, mid)*Q(mid, last) + P(mid, last)
//Q(first, last) = Q(first, mid)*Q(mid, last)
if (last - first == 1){
    calcP(P, first, last);
    calcQ(Q, first, last);
    return;
}

ULONG mid = (first+last)/2;
mpz_class *PP = new mpz_class(*P);
mpz_class *QQ = new mpz_class(*Q);
//Calculate P(first, mid) and Q(first, mid)
binarySplitE(first, mid, P, Q);
//Calculate P(mid, last) and Q(mid, last)
binarySplitE(mid, last, PP, QQ);

//P(first, last) == P(first, mid)
*P *= (*QQ);
//P(first, last) == P(first, mid)*Q(mid, last)
*P += (*PP);
//P(first, last) == P(first, mid)*Q(mid, last) + P(mid, last);

//Q(first, last) == Q(first, mid)
*Q *= (*QQ);
//Q(first, last) == Q(first, mid)*Q(mid, last)

delete PP;
delete QQ;
}


It appears this exit code was returned by MPIR(GMP) because it could not allocate a big amount of memory. It's a bit annoying that this was not in any of the documentation though.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜