Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jaquieline_JJ en 24 Abril 2014, 01:25 am



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)