elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Violación de Segmento 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.
2  Programación / Programación C/C++ / Re: Lanzar excepcion en: 24 Abril 2014, 00:54 am
Hola, disculpen que deje tanto tiempo sin responder por aquí, ya logré hacer lo que necesitaba, más adelante les publico el código  ;D.

Muchas gracias por su ayuda, realmente me dieron ideas para buscar la solución  ;D
3  Programación / Programación C/C++ / Re: Lanzar excepcion en: 25 Marzo 2014, 05:49 am
No, no debo de manejar nada con char ni string  :-(
4  Programación / Programación C/C++ / Re: Lanzar excepcion en: 24 Marzo 2014, 06:33 am
Efectivamente busco hacer algo como lo que dice ivancea96, pero no encuentro como manejarlo para el tipo de dato mpz_t, cale incluso poniendo: catch(mpz_t) y nada, e incluso utilizando algo que encontre llamado catch general (catch(...)) que capta cualquier error y tampoco me funcionó   :-(.

De acuerdo a lo que me ha dicho amchacon, he encontrado el manejo de errores con la funcion mpz_inp_str, la cual devuelve un 0, si el numero que ingreso es erroneo, pero solo me lo devuelve si ingreso al principio una letra u otro caracter diferente a un numero (p. ej. a1111111111111111111111111111111111111111111111111111111111111111111111111111111111111222), pero si pongo: 1111a111 toma los primeros digitos antes de la letra y es lo que quiero que evite   :(. Y perdon por el error, mi programa si esta mas enfocado en c++ puesto que empleo funciones como cin, cout o std  ;D

Help me please  :-(
5  Programación / Programación C/C++ / Lanzar excepcion en: 23 Marzo 2014, 19:16 pm
Hola a todos, esta es mi primera vez en este foro y pues vengo aquí con una duda y a pedir su ayuda.

Lo que pasa es que estoy realizando un programa en C el cual permite al usuario ingresar un numerototote, para ello utilizo la librería gmp.h y obtengo el numero de tipo mpz_t a través del comando gmp_scanf, en este programa (que es para la escuela) no puedo utilizar strings.

El problema que tengo es que busco lanzar una excepción en caso de que el usuario ingrese un numero y accidentalmente (o adrede) ponga un carácter diferente a un numero (p. ej. 1111111111111111111112132134154564545446544dddd5454465464*56) y le diga al usuario que solo debe de ingresar números.

He estado buscando sobre el manejo de excepciones (ya que no se mucho sobre el tema) y encontré una excepcion llamada FormatException en JAVA, pero no encuentro el equivalente para implementarlo en C, he calado otras formas pero no logro hacer que capte la excepcion, ¿Alguno de ustedes sabe si existe algún equivalente, o me pueden decir alguna forma para manejar dicha excepción?  :huh: :huh:

De antemano muchas gracias  ;D
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines