• Domingo 17 de Noviembre de 2024, 17:36

Autor Tema:  Error en el Bus!!  (Leído 2769 veces)

skymir

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Error en el Bus!!
« en: Lunes 27 de Diciembre de 2010, 12:04 »
0
Hola, tengo un problema con un programa que estoy realizando, en el cual me salta un error en el bus cuando le introduzco unos datos determinados. El problema en el codigo se produce(en mi opinion aqui):

 int pot=(int)pow(2,(double)k);
 int *buffer;                      
 buffer=(int *)malloc(pot*n*sizeof(int));
 if ((buffer==NULL))                            //si no hay memoria libre devuelve NULL

     {
        printf ("nNo hay memoria buffer");
        exit(1);
     }

Al programa en cuestion se le meten unos datos por linea de comandos y el fallo me surge cuando la variable k toma valores de 25 hacia arriba. Supongo que esto será devido a que si K toma valores altos la variable pot tomara valores aun mas elevados y la cantidad memoria a reservar será elevada (supongamos n=100). Lo raro es que cuando lanzo el programa si este no fuera capaz de reservar dicha cantidad de memoria deberia de saltar al if que tiene a continuación, cosa que no hace ya que el programa se sigue ejecutando y lineas mas abajo me lanza un ERROR EN EL BUS. Lo que tengo claro es que el error viene determinado por el valor de la variable K.
Estoy utilizando el compilador g++ de Linux por si sirve de ayuda.

Un saludo y gracias!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en el Bus!!
« Respuesta #1 en: Martes 28 de Diciembre de 2010, 01:17 »
0
Ese código que manejas es C, así que supongo que usarás (o deberías) gcc y no g++ que es para C++.

En todo caso, int es un tipo demasiado pequeño para los números tan grandes que quieres manejar. Ya que son potencias te aconsejo unsigned long.

Saludos.

skymir

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #2 en: Martes 28 de Diciembre de 2010, 10:07 »
0
Gracias por contestar, lo que dices es correcto, uso el gcc y lo de cambiar el tipo de dato de int a unsigned long lo habia probado y eso me ha solucionado el tema del error de bus que me daba. El problema que tengo ahora a raiz del mismo es que el programa debe simular el paso de una cierta cantidad de datos(señales) a traves de un canal, siendo este canal no ideal, es decir, metera errores en la señal transmitida y este detalle de introducir errores tengo que hacerlo aleatoriamente atendiendoa una probabilidad de error de bit. Aqui está el problema ya que la variable pot de antes es la que me dice el numero de señales de la que va a constar mi programa y despues debe elegir una de ellas de forma aleatoria y claro hasta ahora estaba empleando la funcion rand() pero me he dado cuenta de que para valores elevados de pot, este me cae fuera del rango de la funcion RAND_MAX. Hay alguna forma de poder cambiar este valor, es decir aumentarlo atendiendo a las necesidades de mi programa u otra funcion que pueda usar?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en el Bus!!
« Respuesta #3 en: Jueves 30 de Diciembre de 2010, 12:50 »
0
No sé si he entendido bien, pero creo que lo más sencillo que puedes hacer en mi opinión es montar un unsigned long long con 2 unsigned int. Por ejemplo:

Código: C
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     unsigned int a = 0xAAAAAAAA;
  6.     unsigned int b = 0xBBBBBBBB;
  7.     unsigned long long c, d;
  8.  
  9.     c = (unsigned long long) a;
  10.     d = (unsigned long long) b;
  11.     d = d << 32;
  12.     c = c | d;
  13.  
  14.     printf("%#llXn", c);
  15.  
  16.     return 0;
  17. }
  18.  
Con esto rand() te vale perfectamente. También puedes utilizar rand() para darle un valor aleatorio a cada bit por separado.

skymir

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #4 en: Viernes 31 de Diciembre de 2010, 13:13 »
0
Gracias por responderme,
 
He probado con lo que me has dicho pero sigo teniendo errores al ejecutar el programa. El problema creo que se localiza aqui:

 long int pot=(long int)pow(2,(double)k);
buffer=(int *)malloc((int)pot*n*sizeof(int));      

    if ((buffer==NULL))                            //si no hay memoria libre devuelve NULL
     {
        printf ("nNo hay memoria buffer");
        exit(1);
     }

Lo que sucede es que cuando le meto como parámetro un valor de K=[1 22] el programa hace su funcion, cuando K=[23 29] el programa no es capaz de reservar la memoria que se le debería asignar a buffer, pero en teoria el funcionamiento sería correcto. El fallo viene cuando K>30 que en teoria si para K mallores que 23 no fue capaz de resevar memoria, para k>30 tampoco deberia de ser capaz y el programa deberia de finalizarse (ejecutandose el if), pero por el contrario lo que me muestra es un error de segmentacion. Es como si se saltase la condicion.
¿Hay alguna manera de conocer el tamaño máximo de memoria que se pueda reservar en un determinado ordenador y tiene sentido que no sea capaz de reservarme memoria de un cierto tamaño y si lo sea para un tamaño mallor?

Saludos y gracias!! :)
 


     }

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en el Bus!!
« Respuesta #5 en: Sábado 1 de Enero de 2011, 17:12 »
0
En teoría el máximo son 4 GiB, pero obviamente el sistema no da para tanto. Ten en cuenta que estás multiplicando siempre por 4, y los números que manejas son muy grandes. Un ordenador común no puede resolver tu problema, aunque no veo la necesidad de reservar tal cantidad ingente de memoria.

PD: es "mayor", no "mallor"  :P

skymir

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #6 en: Sábado 1 de Enero de 2011, 20:45 »
0
Lo de reservar esa cantidad de memoria es porque tengo que generar 2^k palabras de tamaño n, es decir de n bits cada una y necesito tenerlas todas a mano durante la ejecucion del programa. Había probado ha guardarlas todas en un fichero pero esto hacía al programa muy lento y por eso opte por la opción de guardarlas en memoria.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en el Bus!!
« Respuesta #7 en: Domingo 2 de Enero de 2011, 09:21 »
0
Pues me temo que tu ordenador no es suficiente, como te digo. La memoria es limitada.

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #8 en: Lunes 3 de Enero de 2011, 18:06 »
0
Cita de: "skymir"
Lo de reservar esa cantidad de memoria es porque tengo que generar 2^k palabras de tamaño n, es decir de n bits cada una y necesito tenerlas todas a mano durante la ejecucion del programa. Había probado ha guardarlas todas en un fichero pero esto hacía al programa muy lento y por eso opte por la opción de guardarlas en memoria.

Supongamos n=8 y k=10. Deberías reservar: 2^10 * 8 = 8192 bits = 1024 bytes.

Pero en realidad estas reservando (suponemos tamaño int = 4 bytes):
Código: C
  1. buffer=(int *)malloc((int)pot*n*sizeof(int));
  2.  
2^10 * 8 * 4 = 32768 bytes (¡32 veces más de lo necesario!).

Lo primero que debes hacer es averiguar cuantos bytes te hacen falta para almacenar una "palabra de n bits" y luego reservar la memoria necesaria.

skymir

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #9 en: Lunes 3 de Enero de 2011, 19:51 »
0
Comprendo lo que me dices, pero tu estas suponiendo que trabaje con las palabras a nivel de bits, y lo que yo estoy haciendo es que cada 4 posiciónes de memoria sea un bit debido a que uso variable tipo int, es decir imaginemos que tal como tu has supuesto n=8 y K=10, entonces por ejemplo si guardo cada una de las palabras en un array tipo int, cada posicion del array sería para mi un bit con lo que debería de tener arrays de tipo int de tamaño 2^10*n que traducido a memoria seria una reserva de 2^10*n*sizeof(int).

 Ya se que de esta forma estoy despreciando una enorme cantidad de memoria pero para la funcion que tiene que realizar el programa me vale este metodo ya que los K a tratar no serían muy elevados.
 El fallo que tengo que resolver es el de porque cuando intento reservar un tamaño de memoria concreto el programa no es capaz de hacerlo; cosa evidente debido al limite de memoria que pueda tener el ordenador, y cuando intento reservar un tamaño mayor que el anterior si es capaz de hacerlo y mas adelante me salta un fallo de segmentacion.

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Error en el Bus!!
« Respuesta #10 en: Martes 4 de Enero de 2011, 21:51 »
0
Bueno, en mi opinión no es muy adecuado ese modo de operar.

En cuanto al otro problema debes darte cuenta que cuando k > 30 en  malloc probablemente se supera el límite para un entero (de 4 bytes) y el valor es indeterminado, por lo que puede que estes reservando menos memoria o ninguna,  y a la hora de acceder a los datos tengas un fallo de segementación.