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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Creando una función para hallar la media y la desviación en: 13 Mayo 2013, 19:24 pm
Quiero hacer un programa que genere N floats uniformemente distribuidos en un intervalo dado y que calcule la media y la dispersión mediante una función. El código es el siguiente:

Código:
#include <stdio.h>
#include <stdlib.h>
#define DEBUG
int N;
FILE *fout;

void med_var(float *serie, int Numero, float *Media, float *Varianza)
{
  int i;
  for(i=0;i<Numero;i++)
    {
      *Media+=serie[i];
    }
  *Media=*Media/Numero;
  for(i=0;i<Numero;i++)
    {
      *Varianza+=serie[i]*serie[i];
    }
  *Varianza=*Varianza/Numero;
  *Varianza=*Varianza-(*Media)*(*Media);
  printf("Media=%f, Varianza=%f\n",*Media,*Varianza);
}

float frandom(double min, double max)
{
  return min+(max-min)*(rand()/((double)RAND_MAX+1));
}

main(argc,argv)
int argc;
char **argv;
{
  switch(argc)
    {
    case 2:
      sscanf(argv[1],"%d",&N);
      break;
    default:
      N=100;
    }
  int i;
  float med,var,data[N];

  printf("%d\n",N);
 
  fout=fopen("datos.dat","wt");

  for(i=0;i<N;i++)
    {
      data[i]=frandom(-2,5);
    }

#ifdef DEBUG
  for(i=0;i<N;i++)
    {
      printf("data[%d]=%f\n",i,data[i]);
    }
#endif

  med_var(data,N,&med,&var);

  fprintf(fout,"\n%d %f %f",N,med,var);
  fclose(fout);
}

Compila sin problemas pero los valores para la media y la varianza son incorrectos. El caso es que en una versión anterior del programa en la cual N no estaba pillado de la consola al menos la media funcionaba.

¿Alguna pista?
2  Programación / Programación C/C++ / Re: Error al ejecutar un programa en C que he compilado [Windows 8] en: 5 Abril 2013, 18:44 pm
Eso no creo que sea porque el define es una orden al preprocesador con lo que realmente da igual donde lo escriba se ejecuta antes de compilar con lo que el espacio para el array me lo reserva de antemano, ¿me equivoco?

Además me interesa v como variable local, intento trabajar lo menos posible con variables globales.

Lo mejor de todo es que como he dicho antes, en linux puedo compilarlo con gcc y ejecutarlo sin ningún problema. Con lo que parece que el problema radica en hacerlo en windows 8 :S

Edición: He probado y funciona!! Lo cual me lleva a pensar que efectivamente el problema es que estaba escribiendo en vete tu a saber que dirección de memoria y por eso daba error. Lo que no sé es porque como lo tenía yo no es correcto. ¿Podrías intentar explicármelo?
3  Programación / Programación C/C++ / Re: Error al ejecutar un programa en C que he compilado [Windows 8] en: 5 Abril 2013, 18:00 pm
He probado a compilar y ejecutar el mismo código en el pc de un amigo que usa linus (x64 ) y ha funcionado sin problemas. Así que el problema es del puto windows. Creo recordar que a veces había problemas porque había que especificar a la hora de compilar que era un programa para ejecutar desde consola pero no sé si me lo acabo de inventar o cómo hacerlo :-(

Instalaría Linux en arranque dual pero ya lo he intentado y es imposible, no se que pasa, si es el windows 8 o mi ordenador pero no hay manera, y he probado con varias distros, desde usb, desde cd, entrando a un live... nada.
4  Programación / Programación C/C++ / Re: Error al ejecutar un programa en C que he compilado [Windows 8] en: 4 Abril 2013, 20:10 pm
Siento lo de la etiqueta para código, la usaré a partir de ahora. Tengo windows 8 x64, compilo y ejecuto desde consola como administrador utilizando el gcc con el comando

gcc file.c -o file.exe

He probado con otros programas hechos por mi y funcionan, lo cual me lleva a pensar que es un error de código.. pero compila perfectamente sin ningñun warning y lo he repasado varias veces :S
5  Programación / Programación C/C++ / Error al ejecutar un programa en C que he compilado [Windows 8] en: 3 Abril 2013, 18:17 pm
Pues he repasado el código unas cuantas veces y creo que está perfecto, no obstante en cuanto ejecuto el programa ejecutable, bien desde consola o haciendo doble click, me sale la ventanita de "ha dejado de funcionar". Os dejo el código, pero yo creo que debe ser algún tema de compatibilidad o algo..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#define DEBUG
  4.  
  5. void Lee_Iteraciones(int *NDat);
  6. void Histogram(double *data,double *Hist,int N_data,int N_Intervalos,double *d,double *m,double *M);
  7. double frandom(double min,double max);
  8. FILE *fout;
  9.  
  10. main()
  11. {
  12. #define N_Inter 100
  13. #define N_Datos_Max 1000000
  14.  double H[N_Inter],v[N_Datos_Max];
  15.  
  16.  int Niter,i;
  17.  double a,b,minimo,maximo,delta;
  18.  
  19.  a=-3;b=4; // Fijamos el rango de variación del generador plano
  20.  Lee_Iteraciones(&Niter); //Leemos el numero de pasos
  21.  
  22.  if(Niter>N_Datos_Max) //Control
  23.    {
  24.      printf("La cantidad de numeros generados no puede ser superior a &d\n",N_Datos_Max);
  25.      exit(1);
  26.    }
  27.  
  28.  for (i=0;i<Niter;i++) //Generamos los dattos
  29.    v[i]=frandom(a,b);
  30.  
  31.  Histogram(v,H,Niter,N_Inter,&delta,&minimo,&maximo); //Calculamos el histograma
  32.  
  33. #ifdef DEBUG
  34.  for(i=0;i>N_INter;i++) //Escribimos los datos en pantalla
  35.    printf("%d %f %f\n",i,i*delta+minimo,H[i]);
  36. #endif
  37.  
  38. fout=fopen("hist.dat","wt");
  39. for(i=0;i<N_Inter;i++) //Escrinimos en un archivo los datos
  40.  fprintf(fout,"%d %f %f\n",2,2*delta+minimo,H[i]);
  41. fclose(fout);
  42. }
  43.  
  44. double frandom(double min,double max)
  45. {
  46.  /* Genera un número random plano double ne el intervalo [min,max] */
  47.  return min+(max-min)*(rand()/((double)RAND_MAX+1));
  48. }
  49.  
  50. void Histogram(double *data, double *Hist, int N_data, int N_Intervalos, double *d, double *m, double *M)
  51.  
  52. /* Genera un histograma. Calcula el min y el max en funcion de dat para un mejor ajuste.
  53.  
  54.    *data input dat
  55.    *hist output histdat
  56.    n_data input nº de dat
  57.    n_inter input nº de inter
  58.    *d output ancho inter
  59.    *m output min de dat
  60.    *M output max de dat */
  61. {
  62.  int i,Indice;
  63.  double del,min,max,Norm;
  64.  
  65.  for (i=0;i<N_Intervalos;i++) //Inicializo
  66.    Hist[i]=0;
  67.  
  68.  min=-10000000;
  69.  max=10000000;
  70.  
  71.  for (i=0;i<N_data;i++); //Calculo max y min
  72.  {
  73.    if (data[i]<min) min=data[i];
  74.    if (data[i]>max) max=data[i];
  75.  }
  76.  
  77.  del=(max-min)/N_Intervalos; //calculo el ancho de intervalo
  78.  if (del==0)
  79.    {
  80.    printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max,min);
  81.  exit(1);
  82.    }
  83.  
  84.  for(i=0;i<N_data;i++) //Calculo el histograma
  85.    {
  86.  Indice=(data[i]-min)/del;
  87.  Hist[Indice]++;
  88. #ifdef DEBUG
  89.  printf("x=%f, H[%d]=%f\n",Indice*del+min,Indice,Hist[Indice]);
  90. #endif
  91.    }
  92.  *d=del;
  93.  *m=min;
  94.  *M=max;
  95.  
  96.  /* Normalizo */
  97.  
  98.  Norm=1.0/(N_data*del);
  99.  for (i=0;i<N_Intervalos;i++)
  100.    Hist[i]*=Norm;
  101. }
  102.  
  103. void Lee_Iteraciones(int *NDat) /* Lee de la consola el numero de datos a generar */
  104. {
  105.  printf("Introducir la cantidad de numeros a generar:\n");
  106.  scanf("%d",NDat);
  107.  
  108.  if(*NDat<=0)
  109.    {
  110.      printf("El numero de datos a generar debe ser mayor que cero; leido=%d\n",*NDat);
  111.      exit(1);
  112.    }
  113. }

Editado: añadido el coloreado de código.
6  Programación / Programación C/C++ / Undefined reference to 'WinMain@16' en: 26 Febrero 2013, 21:34 pm
Buenas a todos, estoy haciendo un programita en C y a la hora de compilar me da el error que da título al post. He estado buscando por la red y parece ser que ese error ocurre cuando está mal definido el main. El caso es que he repasado el codigo unas cuantas veces y no encuentro nada. Os lo pego a ver si podéis echarle un vistazo.

#include <stdio.h>
#include <stdlib.h>
//#define debug //saca datos por pantalla
FILE *fout;

double frandom(double min, double max) //FUNCION GENERAR RANDOM
{
  /*Genera un número double random en el intervalo [min,max] */

  return min+(max-min)*rand()/((double)RAND_MAX+1));
}

// FIN DE FUNCION GENERAR RANDOM

void histogram(double *dat, double *hist, int n_dat, int n_inter, double *d, double *m, double *M) //FUNCION HISTOGRAMA
{
  /* Genera un histograma. Calcula el min y el max en funcion de dat para un mejor ajuste.

   *data input dat
   *hist output histdat
   n_data input nº de dat
   n_inter input nº de inter
   *d output ancho inter
   *m output min de dat
   *M output max de dat */

  int i,k;
  double anch,min,max,norm;

  for (i=0;i<n_inter;i++) //Inicializo
    hist=0;

  min=-10000000;
  max=10000000;

  for (i=0;i<n_dat;i++); //Calculo max y min
  {
    if (dat<min)
      min=dat;
    if (dat>max)
      max=dat;
  }

  anch=(max-min)/n_inter; //calculo el ancho de intervalo

  if (anch==0) //¿problemas de redondeo?
    {
    printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max,min);
  exit(1);
    }

  for(i=0;i<n_dat;i++) //Calculo el histograma
    {
  k=(dat-min)/anch;
  hist[k]++;
#ifdef DEBUG //Saca datos por pantalla
  printf("x=%f, H[%d]=%f\n",k*anch+min,k,hist[k]);
#endif
    }

  *d=anch;
  *m=min;
  *M=max;

  norm=1,0/(n_dat*anch);
  for (i=0;i<n_inter;i++)
    hist*=norm;
}

//FIN DE FUNCION HISTOGRAMA

void main(void)
{
#define PAS_MAX 100000 //defino nº de pasos máximo
#define n_inter 100 //defino el numero de intervalos

  float min, max, pas, epsilon, delta,ini;
  double dat[PAS_MAX+1], hist[ninter];
  int i;

  printf("Dame el min:\n"); //defino el rango y la posición inicial
scanf("%f",&min);
printf("Dame el max:\n");
scanf("%f",&max);
printf("Dame el ini:\n");
scanf("%f",&ini);

 if (ini>max) //compruebo que la posición inicial esté dentro del rango
  {
printf("Demasiado grande.\n");
exit(0);
}
 else if (ini<min)
   {
printf("Demasiado pequeno.\n");
exit(0);
}

 dat[0]=ini; //¡La posición inicial es un dato válido!
 epsilon=(max-min)/100; //Preguntar dudas sobre el tamaño en relación al número de pasos, rango e histograma

printf("Dame el numero de pasos:\n");
scanf("%f",&pas);

 if (pas>PAS_MAX)
   {
     printf("Demasiados pasos.\n");
     exit(0);
   }

 for (i=1;i<pas;i++) //genero número aleatorio, calculo la nueva posición y la mando a la función histograma
   {
     delta=frandom(-epsilon,epsilon);
 ini=ini+delta;
 if (ini>max) //Soluciono el problema de los bordes
   ini=ini-max+min;
 else if (ini<min)
   ini=ini-min+max;
 dat=ini;
   }
 /* for (i=0;i<pas;i++)
    printf("%f\n",dat); */

 histogram(dat,hist,pas+1,ninter,&anch,&min,&max); //Calculo del histograma

#ifdef DEBUG //Escribo datos por pantalla en modo DEBUG
 for(i=o;i<n_inter;i++)
   printf("%d\t %f\t %f\n",i,i*anch+min,hist);
#endif

 fout=fopen("hist.dat","wt"); //Abro el archivo, escribo los datos y lo cierro
 for (i=0;i<n_inter;i++)
   fprintf(fout,"%d\t %f\t %f\n",i,i*anch+min,hist);
 fclose(fout);

}
7  Programación / Programación C/C++ / Re: Problemas con MinGW-w64 en Windows 8 x64 (¿error en el PATH?) en: 22 Febrero 2013, 16:14 pm
Solucionado. Me bajé el MinGW en vez del 64 y parece que ahora todo funciona correctamente. Garcias!
8  Programación / Programación C/C++ / Re: Problemas con MinGW-w64 en Windows 8 x64 (¿error en el PATH?) en: 22 Febrero 2013, 15:32 pm
No encuentro ningún otro path, excepto el pathext claro. ¿Quizás he instalado mal el mingw-w64? Lo que hice fue descomprimir la carpeta y pegarla en C: (le cambie el nombre a mingw64 pero es un dato sin importancia). Dentro de esa caprte hay otra llamada bin y es a la que me dirijo en el PATH. Tambié hay una carpeta llamada mingw y dentro de este una bin, probe a meterla en el path pero no ha servido de nada. Lo mismo para la carpeta x86_64-w64-mingw32. Si te bajas el archivo podrás ver la estructura por ti mismo, te dejo el link exacto http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download
9  Programación / Programación C/C++ / Problemas con MinGW-w64 en Windows 8 x64 (¿error en el PATH?) en: 22 Febrero 2013, 14:08 pm
Saludos a todos,

He instalado MinGW-64 (mingw-w64-bin_i686-mingw_20111220) en mi Windows 8 x64 para programar en C utilizando Emacs (emacs-24.2-bin-i386). Está instalado en C:\mingw64 por lo que antes de utilizarlo he ido a panel de control:variables de entorno:avanzado y he modificado path añadiendo "....;C:\mingw64\bin;"

Luego entro en cmd.exe, voy al directorio donde tengo mi archivo.c y ejecuto gcc archivo.c -o archivo.exe Y me da el clásico error de gcc comando no reconocido. He probado a reinstalar, utilizar g++ como comando, modificar el path desde consola... y nada. Estoy ya bastante desesperado así que toda ayuda será bien recibida.

Un saludo y gracias!
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines