Programación General > C/C++

 Error en el Bus!!

(1/3) > >>

skymir:
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:
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:
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:
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 ---#include <stdio.h> int main(){    unsigned int a = 0xAAAAAAAA;    unsigned int b = 0xBBBBBBBB;    unsigned long long c, d;     c = (unsigned long long) a;    d = (unsigned long long) b;    d = d << 32;    c = c | d;     printf("%#llXn", c);     return 0;} Con esto rand() te vale perfectamente. También puedes utilizar rand() para darle un valor aleatorio a cada bit por separado.

skymir:
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!! :)
 


     }

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa