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;
}