GMP Core Dump durante l'utilizzo di mpz_clear in C

0

Sto lavorando ad un programma di fattorizzazione principale scritto in C usando la libreria GMP tramite cygwin. L'algoritmo che ho ora funziona bene, ma ha perdite di memoria dal non usare la funzione mpz_clear sul mio mpz_t quando ho finito con loro. Ogni volta che provo ad aggiungere mpz_clear per fermare queste perdite, ottengo errori di segmentazione o core dump. Anche allora, se provo ad accedere al mio array di esponenti dopo che è stato modificato dalla funzione fattorizzazione, ottengo più errori di segmentazione anche se sono sicuro che non accedo oltre i limiti dell'array. Non si tratta di una lezione o di qualcosa, sto solo cercando di imparare su C e le librerie di terze parti e su come gestire gli errori di segmentazione.

Inoltre, ho provato a guardare questo in gdb ma ottengo (??) come il numero di riga accanto all'indirizzo di memoria ogni volta che trova il problema, che chiaramente non è molto utile. Se qualcuno potesse dare un'occhiata a questo codice per vedere cosa sta causando i difetti di segmentazione, sarei grato. Più probabile che no ci sono un paio di problemi, ma non so cosa siano. Ho cercato di capirlo per alcuni giorni e non ho fatto progressi.

In breve, ciò che fa è prendere un numero, scomporlo per divisione di prova, e poi voglio stampare gli esponenti sullo schermo. Se provo a stamparli sullo schermo utilizzando la parte commentata nella parte inferiore del main, ottengo errori di segmentazione.

Grazie in anticipo

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include"gmp.h"

#define MAX_NUM_CHARACTERS 100

void factorize(mpz_t input, long *exponents) {
    int prime = mpz_probab_prime_p(input,25);

    if (prime>=1) {
        printf("%s", "\nInput is a prime number.\n");
        return;
    }
    else {
        mpz_t prime;
        mpz_init_set_ui(prime, 2);

        int j=0;
        while(mpz_cmp(prime,input)<=0) {
            long smoothness;  // number of times a prime factor divides
            smoothness = 0;

            smoothness=mpz_remove(input, input,prime);

            if (smoothness==0) {
                mpz_nextprime(prime,prime);
                continue;
            }
            else {
                exponents[j]=smoothness;
                mpz_nextprime(prime,prime);
                j++;
            }           
        }
        printf("%s", "\n");
    }
    return;
}

int main() {
    int inputchoice = 0;
    printf("Enter 1 to decode an integer, or 0 to encode a string.\n");
    scanf("%d", &inputchoice);

    if(inputchoice==1) {
        char inputstr[MAX_NUM_CHARACTERS+1];
        scanf("%s", inputstr);

        mpz_t input;
        mpz_set_str(input,inputstr,10);

        static long exponents[MAX_NUM_CHARACTERS];

        factorize(input, exponents);

        int i;
        int j;
        j=0;
        /*
        for (i=0;i<MAX_NUM_CHARACTERS;i++) {
            printf("%d,",exponents[i]);
        }
        */
    }
    return 0;
}
    
posta Hesterj 08.05.2015 - 20:40
fonte

0 risposte

Leggi altre domande sui tag