Autor
|
Tema: Error al ejecutar un programa en C que he compilado [Windows 8] (Leído 14,604 veces)
|
Schrödinger
Desconectado
Mensajes: 9
|
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.
|
|
« Última modificación: 5 Abril 2013, 21:21 pm por WHK »
|
En línea
|
|
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Ejecutar como administrador?
|
|
|
En línea
|
I like to test things.
|
|
|
Schrödinger
Desconectado
Mensajes: 9
|
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
|
|
|
En línea
|
|
|
|
Schrödinger
Desconectado
Mensajes: 9
|
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.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
El problema puede deberse a la declaración del array "v" en la función principal: main() { #define N_Inter 100 #define N_Datos_Max 1000000 double H[N_Inter],v[N_Datos_Max];
Intenta colocando esa declaracion fuera de la función, por ejemplo junto a la variable "fout": FILE *fout; #define N_Datos_Max 1000000 double v[N_Datos_Max]; int main(void) { ...
Otra opción, si se necesita mantener al objeto como local, es reservando el espacio en tiempo de ejecución con malloc, calloc o realloc. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
Schrödinger
Desconectado
Mensajes: 9
|
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?
|
|
« Última modificación: 5 Abril 2013, 19:02 pm por Schrödinger »
|
En línea
|
|
|
|
85
|
igualmente fijate, poné tu código en este compilador online de C/C++ y fijate que hay varios problemas http://www.compileonline.com/compile_cpp_online.phpCompiling the source code.... $g++ /tmp/136516399727456.cpp -o /tmp/136516399727456 -lm 2>&1 /tmp/136516399727456.cpp: In function 'int main()': /tmp/136516399727456.cpp:29: error: incompatible types in assignment of 'double' to 'double [1000000]' /tmp/136516399727456.cpp: In function 'void Histogram(double*, double*, int, int, double*, double*, double*)': /tmp/136516399727456.cpp:73: error: invalid operands of types 'double*' and 'double' to binary 'operator<' /tmp/136516399727456.cpp:73: error: cannot convert 'double*' to 'double' in assignment /tmp/136516399727456.cpp:74: error: invalid operands of types 'double*' and 'double' to binary 'operator>' /tmp/136516399727456.cpp:74: error: cannot convert 'double*' to 'double' in assignment /tmp/136516399727456.cpp:86: error: invalid operands of types 'double*' and 'double' to binary 'operator-' /tmp/136516399727456.cpp:100: error: invalid operands of types 'double*' and 'double' to binary 'operator*' /tmp/136516399727456.cpp:100: error: in evaluation of 'operator*=(double*, double)'
fijate si los podés arreglar para que al menos se compile en el compilador online así te podemos ayudar mejor .
|
|
« Última modificación: 5 Abril 2013, 21:18 pm por 85 »
|
En línea
|
|
|
|
WHK
|
Y si intentas utilizar visual c++ para que el IDE te diga donde te estas equibocando? En algún torrent debe andar el visual studio 2012.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Lo que no sé es porque como lo tenía yo no es correcto. ¿Podrías intentar explicármelo? Tienes problemas con esa variable porque depende del compilador el tamaño del área donde se almacenan las variables locales (stack o pila). Para evitarlo debes cambiar la clase de almacenamiento de la variable de automático (utiliza la pila) a estático (utiliza el montículo o heap). Para estos temas (heap y stack) lo mejor es revisar sitios con información de calidad como wikipedia. Ese cambio se puede realizar de tres formas: 1) La ya mencionada, colocando la declaración fuera de toda función. 2) Utilizando un puntero y reservando el espacio de memoria mediante malloc, calloc o realloc. 3) Declarando el array dentro de la función y calificándolo con static. igualmente fijate, poné tu código en este compilador online de C/C++ y fijate que hay varios problemas Lo que pasa es que lo estas compilando como C++, si lo compilas como C no se presentan esos errores (pero se presentan otros: cambiar la definición de main y la primera llamada a printf). Un saludo
|
|
« Última modificación: 6 Abril 2013, 04:28 am por rir3760 »
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Error en windows xp, no puedo ejecutar programas.
Seguridad
|
Didy
|
0
|
2,887
|
6 Diciembre 2012, 19:53 pm
por Didy
|
|
|
error al ejecutar el programa
Programación C/C++
|
upc_87
|
5
|
2,767
|
22 Febrero 2013, 17:52 pm
por upc_87
|
|
|
Error al tratar de ejecutar un programa.. Ayuda
GNU/Linux
|
Puede_Ser
|
1
|
4,841
|
3 Mayo 2017, 15:53 pm
por dato000
|
|
|
Error: ARCHIVO FUENTE NO COMPILADO [SOLUCIONADO]
Programación C/C++
|
fabianekggg
|
7
|
30,404
|
4 Marzo 2018, 21:22 pm
por fabianekggg
|
|
|
¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
ASM
|
Usuario887
|
7
|
7,874
|
20 Febrero 2021, 22:50 pm
por Eternal Idol
|
|