Error al ejecutar un programa en C que he compilado [Windows 8]

Iniciado por Schrödinger, 3 Abril 2013, 18:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Schrödinger

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);
     exit(1);
   }

 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]);
fclose(fout);
}

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);
 exit(1);
   }

 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");
 scanf("%d",NDat);

 if(*NDat<=0)
   {
     printf("El numero de datos a generar debe ser mayor que cero; leido=%d\n",*NDat);
     exit(1);
   }
}


Editado: añadido el coloreado de código.

85

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

Citarcode=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
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

OmarHack

I like to test things.

Schrödinger

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

Schrödinger

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.

rir3760

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

#6
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?

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

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

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.

rir3760

#9
Cita de: Schrödinger en  5 Abril 2013, 18:44 PMLo 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.

Cita de: 85 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
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
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