final inesperado

simon
14 de Marzo del 2006
podrian ayudarme y decirme por que este programa se termina antes de que deviera hacerlo

#include<stdio.h>
#include <graphics.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<math.h>

void inicia_graficos();
void marco();
void inicia_mouse();
void aparece_mouse();
void boton_normal(int mix, int miy, char *titulo);
void boton_presionado(int mix, int miy);
float valor(char *tipo, char *dato, char *boton);

int crea_mat(double **mat, int f, int c);
void llena_mat(double **mat, int ren, int col);
void libera_mat(double **mat, int f);

void main()
{
int f; /* número de filas */
int c; /* número de columnas */
double **mat; /* puntero de puntero */

inicia_graficos();
inicia_mouse();

/* obtengo f y c */
f=valor("Numero de renglones", "R", "Establecer");
c=f+1;

/* Asigno memoria */
crea_mat(mat, f, c);

/* Llena la matriz */
llena_mat(mat, f,c);

/* Libera la matriz */
libera_mat(mat, f);
}

void inicia_graficos()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:\tc\bgi");
errorcode = graphresult();

if (errorcode != grOk)
{
printf("Error de graficos: %sn", grapherrormsg(errorcode));
printf("No se encuentran los archivos necesarios para iniciar el programa");
delay(5000);
exit(1);
}
}

//funcion que inicia el mouse colocando un 0 en in.x.ax
void inicia_mouse()
{
union REGS in,out;
in.x.ax=0;
int86(0x33,&in,&out);
}

//esta funcion muestra el mouse en pantalla colocando un 1 en in.x.ax
void aparece_mouse()
{
union REGS in,out;
in.x.ax=1;
int86(0x33,&in,&out);
}

//la funcion edo_mouse regresa las coordenadas donde se encuentra el mouse y si se presiono un boton de este
void edo_mouse(int *botrat1,int *x,int *y)
{
union REGS in,out;
in.x.ax=3;
int86(0x33,&in,&out);
*botrat1=out.x.bx;
*x=out.x.cx;
*y=out.x.dx;
}

//esta funcion desaparece el mouse de la pantalla para que se pueda dibujar algo sin que el mouse se interponga
//para ello coloca un 2 en in.x.ax
void esconde_mouse()
{
union REGS in,out;
in.x.ax=2;
int86(0x33,&in,&out);
}

void marco()
{
//cuadro instalacion
setfillstyle(1,DARKGRAY);
setcolor(WHITE);
arc(175,170,90,180,5);
arc(465,170,0,90,5);
arc(175,310,180,270,5);
arc(465,310,270,360,5);
line(175,165,465,165);
line(170,170,170,310);
line(175,315,465,315);
line(470,170,470,310);
floodfill(190,180,WHITE);
setcolor(BLACK);
line(235,240,430,240);
line(235,240,235,256);
setcolor(LIGHTGRAY);
line(235,257,430,257);
line(430,240,430,256);
}

void boton_normal(int mix, int miy, char *titulo)
{
int px;

setcolor(LIGHTGRAY);
line(mix,miy,mix+80,miy);
arc(mix,miy+8,90,270,8);
setcolor(BLACK);
line(mix,miy+16,mix+80,miy+16);
arc(mix+80,miy+8,270,90,8);
setcolor(WHITE);
px =(80-textwidth(titulo)) / 2;
outtextxy(mix+px, miy+5, titulo);
}

void boton_presionado(int mix, int miy)
{
setcolor(BLACK);
line(mix,miy,mix+80,miy);
arc(mix,miy+8,90,270,8);
setcolor(LIGHTGRAY);
line(mix,miy+16,mix+80,miy+16);
arc(mix+80,miy+8,270,90,8);
}

float valor(char *tipo, char *dato, char *boton)
{

int x=240, y=248, tecla=0, botrat1, xr,yr, i=0;
union REGS raton;

char var[5];
marco();
setcolor(WHITE);
outtextxy(x-40,y-48, tipo);
outtextxy(x-45,y-3, dato);
boton_normal(x+110,y+32, boton);
aparece_mouse();
while(tecla!=13)
{ /*
do
{
setcolor(WHITE);
outtextxy(x,y,"_");
delay(200);
setcolor(DARKGRAY);
outtextxy(x,y,"_");

edo_mouse(&botrat1,&xr,&yr);

if(botrat1==1)
{
if(xr>350&&yr>280&&xr<430&&yr<360)
{
esconde_mouse();
boton_presionado(350,280);
delay(100);
boton_normal(350,280, "Continuar");
cleardevice();
return atof(var);
}
}

delay(200);
}while(!kbhit());*/
if(tecla)
x+=8;
tecla=getch();

if(tecla!=13)
{
var[i]=tecla;
var[i+1]='';
i++;
}
else
{
cleardevice();
return atof(var);
}
setcolor(WHITE);
outtextxy(240,y, var);
}
}



int crea_mat(double **mat, int f, int c)
{
int i;

mat=(double**)calloc(f,sizeof(double*));
if(mat)
{
for(i=0; i<f; i++)
{
mat[i]=(double*)calloc(c,sizeof(double));
if(!mat[i])
return 0;

}
return 1;
}
return 0;
}

void llena_mat(double **mat, int ren, int col)
{
int i, j;

for(i = 0; i < ren; i++)
for(j = 0; j < col; j++)
mat[i][j]=valor("Valores", "","Siguiente");
}

void libera_mat(double **mat, int f)
{
int i;

for(i=0; i<f; i++)
{
free( mat[i] );
}

free(mat);
}