From: Russell Marks (russell.marks@ntlworld.com)
Date: Thu 07 Sep 2000 - 14:47:19 IDT
> Look at the comments and pliiiiiiiiiiiiiiiiiiisssssssssss help. Oh, well since you use *nineteen* i's, how can I possibly refuse? ;-) > #include <stdio.h> > #include <stdlib.h> > #include <vgagl.h> > #include <vga.h> > #include <string.h> > #include <unistd.h> > #include <fcntl.h> > > struct fecha { > int dia; > int mes; > int anio; > }; > > struct personas { > int id; > char apellido [40]; > char nombre [40]; > char direccion [50]; > char email [40]; > char tel1 [40]; > char tel2 [40]; > struct fecha cumple; > }; > > > void limpiar(); > void llenardatos(); > void abrir(); > > > #define TEXT 0 > #define VIDEOMODE 12 Don't do that. I did something a bit like that in 1993 and it haunted me for years. :-) Use "#define VIDEOMODE G1024x768x256", which also gives the reader some idea of what the mode *is*... > int i, j, rta, xmax, ymax, midx, midy, x1, x2, y1, b, c, fd; > > GraphicsContext *physical_screen; > GraphicsContext *virtual_screen; > > > struct personas *contactos; > > int main (void) > { > > > extern unsigned char *gl_font8x8; Not a good place to put an extern, IMHO. > vga_disabledriverreport(); > vga_init(); > vga_setmode(VIDEOMODE); > gl_setcontextvga(VIDEOMODE); > > physical_screen = gl_allocatecontext(); > gl_getcontext(physical_screen); > gl_setcontextvgavirtual(VIDEOMODE); > virtual_screen = gl_allocatecontext(); > gl_getcontext(virtual_screen); > gl_setcontext(virtual_screen); > gl_setfont(8,8,gl_font8x8); > gl_setwritemode(FONT_COMPRESSED + WRITEMODE_MASKED); > > xmax = vga_getxdim(); > ymax = vga_getydim(); > midx = xmax / 2; > midy = ymax / 2; > > > > > > gl_clearscreen(0); > vga_setmode(TEXT); > > exit(EXIT_SUCCESS); > } Your main() doesn't actually call agregar() - maybe you should have sent us the program which *did* segfault, rather than one which couldn't have. ;-) But I'll assume you meant the call to be in the gap above. > void abrir () > { > > if(fd = open("contactos.dat", O_CREAT, 0644) < 0) { "foo.c:84: warning: suggest parentheses around assignment used as truth value" gcc -Wall is your friend. :-) I think you meant: if((fd = open("contactos.dat", O_CREAT, 0644)) < 0) { With the line you previously had, you were only ever going to get 0 or 1 in `fd' - stdin or stdout. (In the `successful' case, it would be stdin.) Probably not what you meant. > mensaje("Hubo un error al abrir el Archivo"); > exit(EXIT_FAILURE); > } > } We didn't get to see mensaje(), but I'll assume it's basically puts()-like. (That doesn't seem very important though.) > void agregar() > { > abrir(); > llenardatos(); > } > > void llenardatos (void) > { > > limpiar(); > gl_printf(300,100,"Apellido"); > gl_copyscreen(physical_screen); > > i = 0; > > /* i believe the problem is here. When this line arrives i get a > segmentation fault. Signal 11. Core Dumped. Im not sure, but perhaps there > is something bad with the structures. Please test the code and see in which > way it can work: receiving the characters and printing it to the location. > (I will make the 'cursor' to move, dont worry, but for now i just want to > see where is the mistake and in which way I can get a char, store it in the > structure and printing it. */ The first time the loop is entered and the while() condition evaluated, `contactos' is NULL, leading to the segfault. In fact, you don't *ever* give `contactos' a value. I suspect you meant your earlier `struct personas *contactos' to be an array rather than a pointer, or perhaps you meant to malloc() some space for it but forgot. > while((contactos->apellido[i] = getchar()) != '\n') { It would be better to use vga_getch() than getchar(). > gl_printf(600,100, "%c", contactos->apellido[i]); > gl_copyscreen(physical_screen); Rewriting the entire 768k screen for every keypress may be overdoing it slightly. :-) > i++; > } > > > getchar(); > } > > > void limpiar(void) > { > gl_clearscreen(0); > } -Rus.
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST