Título: Violación de Segmento Publicado por: Jaquieline_JJ en 24 Abril 2014, 01:25 am Hola a todos, bueno jeje ;D, estoy realizando una programa para mi escuela en c++ bajo una máquina virtual en Linux (AntiX), el programa se basa en realizar la suma de los n primeros números enteros impares a través de una función recursiva, es decir, si tecleamos 3, el resultado será 9 que es la suma de 1 más 3 más 5.
Esta practica debe aceptar numerotes muy grandotes, por ello estoy empleando el tipo de dato mpz_t de la librería gmp.h, el problema que tengo es a mi parecer raro puesto que si pongo por ejemplo el numero 130000 me dice que la suma es 16900000000 , pero si pongo 130960 dice: Violacion de segmento. (El programa permite al usuario volver a ingresar otro numero si asi lo desea). Lo extraño viene cuando despues vuelvo a correr el programa e ingreso el numero 130000, me da el resultado, luego ingreso 130920, me da el resultado, despues ingreso 130940, da el resultado y despues pongo exactamente el 130960 y ahora si sale el resultado (17150521600), pero ahora si pongo un numero mas grande vuelve a salir: Violacion de segmento. :-( Mi código es el siguiente (anexo solamente el main y la funcion recursiva): int main() { mpz_t numero,sum,resta,resta2,mul; int again; //double n, sum; mpz_init(numero); mpz_init(sum); mpz_init(resta); mpz_init(resta2); mpz_init(mul); system("clear"); cout<<"\t\tBienvenido a la Practica 3"<<endl<<endl; do { pedir(numero); gmp_printf("tu numero es: %Zd \n", numero); mpz_set_str(sum,"0", 10); //inicializo sum mpz_set_str(resta,"0", 10); //inicializo resta mpz_set_str(resta2,"0", 10); //inicializo resta2 mpz_set_str(mul,"0", 10); //inicializo mul suma(numero,resta,sum,mul,resta2); gmp_printf("La suma es: %Zd \n", sum); again = otraVez("\n\tDeseas ingresar otro numero "); }while(again == 1); return 0; } // Funcion recursiva void suma(mpz_t n,mpz_t resta,mpz_t sum,mpz_t mul,mpz_t resta2) { if((mpz_cmp_ui(n, 1)) == 0 || (mpz_cmp_ui(n, 1)) < 0){ // n<=1 mpz_add_ui(sum, sum, 1); } else{ mpz_mul_ui(mul, n, 2); mpz_sub_ui(resta2, mul, 1); mpz_add(sum, sum, resta2); mpz_sub_ui(resta, n, 1); suma(resta,resta,sum,mul,resta2); } } ¿Alguno de ustedes sabe como puedo corregir esto? De antemano gracias por su ayuda. Título: Re: Violación de Segmento Publicado por: engel lex en 24 Abril 2014, 04:11 am puedes intentar hacer debug a tu codigo a ver donde se da la violacion :P lo más probable es que se dé porque no especificaste la precisión en bytes o porque no inicializaste un numero (las 2 razones más comunes que me dio a mi esa librería)
|