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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error al ejecutar un programa en C que he compilado [Windows 8]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Error al ejecutar un programa en C que he compilado [Windows 8]  (Leído 14,766 veces)
Schrödinger

Desconectado Desconectado

Mensajes: 9


Ver Perfil
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.


« Última modificación: 5 Abril 2013, 21:21 pm por WHK » En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #1 en: 4 Abril 2013, 02:54 am »

lo primero que se requiere es que si podés usar las etiquetas de código, y las de c++ preferentemente:

Citar
code=cpp

Es para mejor lectura del texto, después me vi obligado a mirar algo sobre win8 porque no lo tengo XD
http://www.softwareok.com/?seite=faq-Windows-8&faq=3
http://conocimientoadictivo.blogspot.com/2012/10/informacion-tecnica-windows-8.html

Pero como dijiste, tu código parece no salirse de lo standard , podés decirnos algunos datos más sobre el compilador, las opciones de compilación o las opciones del proyecto en general, si tu sistema es x32 o x64, etc
Más información así la gente se anima a responderte, y lo de las etiquetas.
hasta luego


En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
OmarHack


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #2 en: 4 Abril 2013, 04:37 am »

Ejecutar como administrador?
En línea

I like to test things.
Schrödinger

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #3 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
En línea

Schrödinger

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #4 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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #5 en: 5 Abril 2013, 18:29 pm »

El problema puede deberse a la declaración del array "v" en la función principal:
Código
  1. main()
  2. {
  3. #define N_Inter 100
  4. #define N_Datos_Max 1000000
  5.  double H[N_Inter],v[N_Datos_Max];

Intenta colocando esa declaracion fuera de la función, por ejemplo junto a la variable "fout":
Código
  1. FILE *fout;
  2. #define N_Datos_Max  1000000
  3. double v[N_Datos_Max];
  4.  
  5. int main(void)
  6. {
  7.   ...

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 Desconectado

Mensajes: 9


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #6 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?
« Última modificación: 5 Abril 2013, 19:02 pm por Schrödinger » En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #7 en: 5 Abril 2013, 21:15 pm »

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.php

Citar
Compiling 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  ;D.

« Última modificación: 5 Abril 2013, 21:18 pm por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #8 en: 5 Abril 2013, 21:24 pm »

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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error al ejecutar un programa en C que he compilado [Windows 8]
« Respuesta #9 en: 6 Abril 2013, 04:26 am »

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error en windows xp, no puedo ejecutar programas.
Seguridad
Didy 0 2,894 Último mensaje 6 Diciembre 2012, 19:53 pm
por Didy
error al ejecutar el programa
Programación C/C++
upc_87 5 2,787 Último mensaje 22 Febrero 2013, 17:52 pm
por upc_87
Error al tratar de ejecutar un programa.. Ayuda
GNU/Linux
Puede_Ser 1 4,965 Último mensaje 3 Mayo 2017, 15:53 pm
por dato000
Error: ARCHIVO FUENTE NO COMPILADO [SOLUCIONADO]
Programación C/C++
fabianekggg 7 30,880 Último mensaje 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 8,031 Último mensaje 20 Febrero 2021, 22:50 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines