|
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: #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.. #include <stdio.h> #include <stdlib.h> //#define DEBUG void Lee_Iteraciones(int *NDat); void Histogram(double *data,double *Hist,int N_data,int N_Intervalos,double *d,double *m,double *M); double frandom(double min,double max); FILE *fout; main() { #define N_Inter 100 #define N_Datos_Max 1000000 double H[N_Inter],v[N_Datos_Max]; int Niter,i; double a,b,minimo,maximo,delta; a=-3;b=4; // Fijamos el rango de variación del generador plano Lee_Iteraciones(&Niter); //Leemos el numero de pasos if(Niter>N_Datos_Max) //Control { printf("La cantidad de numeros generados no puede ser superior a &d\n",N_Datos_Max ); } for (i=0;i<Niter;i++) //Generamos los dattos v[i]=frandom(a,b); Histogram(v,H,Niter,N_Inter,&delta,&minimo,&maximo); //Calculamos el histograma #ifdef DEBUG for(i=0;i>N_INter;i++) //Escribimos los datos en pantalla printf("%d %f %f\n",i ,i *delta +minimo ,H [i ]); #endif fout =fopen("hist.dat","wt"); for(i=0;i<N_Inter;i++) //Escrinimos en un archivo los datos fprintf(fout ,"%d %f %f\n",2,2*delta +minimo ,H [i ]); } double frandom(double min,double max) { /* Genera un número random plano double ne el intervalo [min,max] */ return min +(max -min )*(rand()/((double)RAND_MAX +1)); } void Histogram(double *data, double *Hist, int N_data, int N_Intervalos, double *d, double *m, double *M) /* 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,Indice; double del,min,max,Norm; for (i=0;i<N_Intervalos;i++) //Inicializo Hist[i]=0; min=-10000000; max=10000000; for (i=0;i<N_data;i++); //Calculo max y min { if (data[i]<min) min=data[i]; if (data[i]>max) max=data[i]; } del=(max-min)/N_Intervalos; //calculo el ancho de intervalo if (del==0) { printf("Error: No se pueden calcular los intervalos; max=%lf, min=%lf\n",max ,min ); } for(i=0;i<N_data;i++) //Calculo el histograma { Indice=(data[i]-min)/del; Hist[Indice]++; #ifdef DEBUG printf("x=%f, H[%d]=%f\n",Indice *del +min ,Indice ,Hist [Indice ]); #endif } *d=del; *m=min; *M=max; /* Normalizo */ Norm=1.0/(N_data*del); for (i=0;i<N_Intervalos;i++) Hist[i]*=Norm; } void Lee_Iteraciones(int *NDat) /* Lee de la consola el numero de datos a generar */ { printf("Introducir la cantidad de numeros a generar:\n"); if(*NDat<=0) { printf("El numero de datos a generar debe ser mayor que cero; leido=%d\n",*NDat ); } }
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);
}
|
|
|
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!
|
|
|
|
|
|
|