A problem when I insert a structure.
- From: Ana Gutiérrez Pascual <al004180 anubis uji es>
- To: gtk-list <gtk-list gnome org>
- Subject: A problem when I insert a structure.
- Date: Mon, 24 Feb 2003 14:18:23 +0100 (NFT)
Hi,
I've got an error: Segmentation Fault when I run my code.
It goes well with structures linea and rectangulo, but when I want to
insert another, in this case called circulo, the error appears.
See in my code fuction EventoExponer the last instruction called
DibujarCirculo.
I haven't any idea to solve it, could anybody tell me something?
thanks in advance.
ana.
//code program.h
#include <gtk/gtk.h>
typedef struct {
gdouble lx1;
gdouble lx2;
gdouble ly1;
gdouble ly2;
double lgrosor;
GdkColor lcolor;
GdkFont *lfont;
gchar *lnombre;
} linea_t;
typedef struct {
gdouble rx, ry, ranchura, raltura;
double rgrosor;
GdkColor rcolor;
GdkFont *rfont;
gchar *rnombre;
} rectangulo_t;
typedef struct {
gdouble cx, cy, canchura, caltura, cangulo1, cangulo2;
gdouble cradio;
gdouble ccentrox, ccentroy;
double cgrosor;
GdkColor ccolor;
GdkFont *cfont;
gchar *cnombre;
} circulo_t;
typedef struct
{
GtkWidget *window;
gchar *nom;
GtkWidget *drawingarea;
GdkColormap *gdkcolormap;
GdkGC *gdkgc;
} aplicacion_t;
typedef struct
{
aplicacion_t *aplicacion;
linea_t *linea;
rectangulo_t *rectangulo;
circulo_t *circulo;
} datos_t;
void InicializarLinea(linea_t *l);
void InicializarRectangulo(rectangulo_t *r);
void InicializarCirculo(circulo_t *c);
void DibujarLinea(aplicacion_t *a, linea_t *l);
void DibujarRectangulo(aplicacion_t *a, rectangulo_t *r);
void DibujarCirculo(aplicacion_t *a, circulo_t *c);
gboolean EventoExponer(GtkWidget *widget,
GdkEventButton *event,
datos_t * datos);
// code program.c
#include "program.h"
#include <stdio.h>
gint main (gint argc,gchar *argv[])
{
linea_t lin;
rectangulo_t rec;
aplicacion_t app;
datos_t datos;
GtkWidget *vbox;
datos.aplicacion= &app;
datos.linea= &lin;
datos.rectangulo= &rec;
gtk_init (&argc, &argv);
InicializarLinea(&lin);
InicializarRectangulo(&rec);
app.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (app.window), "Hola Hello Salut!");
gtk_signal_connect(GTK_OBJECT (app.window), "destroy",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
gtk_container_border_width (GTK_CONTAINER (app.window), 150);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER (app.window), vbox);
gtk_widget_show(vbox);
app.drawingarea = gtk_drawing_area_new();
//gtk_drawing_area_size(GTK_DRAWING_AREA(app.drawingarea), 10, 10);
gtk_box_pack_start(GTK_BOX(vbox), app.drawingarea, TRUE, TRUE, 0);
gtk_widget_show(app.drawingarea);
gtk_widget_realize(app.window);
app.gdkgc= gdk_gc_new(app.window->window);
app.gdkcolormap= gdk_colormap_get_system();
gtk_widget_set_events(app.drawingarea, GDK_EXPOSURE_MASK);
gtk_signal_connect(GTK_OBJECT(app.drawingarea),
"expose_event",
GTK_SIGNAL_FUNC(EventoExponer),
&datos);
gtk_widget_show(app.window);
gtk_main();
exit(0);
}
void InicializarLinea(linea_t *l)
{
l->lx1= 50;
l->lx1= 50;
l->lx2= 100;
l->ly1= 80;
l->ly2= 80;
l->lgrosor= 5;
l->lcolor.red= 0xffff;
l->lcolor.green= 0;
l->lcolor.blue= 0;
l->lfont=
gdk_font_load("-Adobe-Helvetica-Bold-R-Normal--*-140-*-*-*-*-*-*");
l->lnombre= "l- 0 0";
}
void InicializarRectangulo(rectangulo_t *r)
{
r->rx= 100;
r->ry= 100;
r->ranchura= 150;
r->raltura= 100;
r->rgrosor= 5;
r->rcolor.red= 0xffff;
r->rcolor.green= 0;
r->rcolor.blue= 0xffff;
r->rfont= gdk_font_load
("-Adobe-Helvetica-Bold-R-Normal--*-140-*-*-*-*-*-*");
r->rnombre= "r- 0 1";
}
void InicializarCirculo(circulo_t *c)
{
c->cx= 20;
c->cy= 150;
c->canchura= 60;
c->caltura= 60;
c->cangulo1= 0;
c->cangulo2= 64*360;
c->cradio= c->canchura/2;
//será el radio correcto siempre q altura y anchura sean la misma,
sino se dibujaría un óvalo
c->ccentrox= c->cx+c->cradio;
c->ccentroy= c->cy+c->cradio;
c->cgrosor= 4;
c->ccolor.red= 0;
c->ccolor.green= 0;
c->ccolor.blue= 0;
c->cfont= gdk_font_load
("-Adobe-Helvetica-Bold-R-Normal--*-140-*-*-*-*-*-*");
c->cnombre= "c- 0 2";
}
void DibujarLinea(aplicacion_t *a, linea_t *l)
{
//reserva un espacio en color map para el color
gdk_colormap_alloc_color(a->gdkcolormap, &l->lcolor, TRUE, TRUE);
//esta función pone el color al gdkgc q se va a dibujar
gdk_gc_set_foreground(a->gdkgc, &l->lcolor);
gdk_gc_set_line_attributes(a->gdkgc,
l->lgrosor,
GDK_LINE_SOLID,
GDK_CAP_BUTT,
GDK_JOIN_MITER);
gdk_draw_line(a->window->window, a->gdkgc, l->lx1, l->ly1, l->lx2,
l->ly2);
if (l->lfont == NULL)
g_print("font is NULL\n");
else
gdk_draw_string(a->window->window, l->lfont, a->gdkgc, l->lx1,
l->ly1-10, l->lnombre);
}
void DibujarRectangulo(aplicacion_t *a, rectangulo_t *r)
{
gdk_colormap_alloc_color(a->gdkcolormap, &r->rcolor, TRUE, TRUE);
gdk_gc_set_foreground(a->gdkgc, &r->rcolor);
gdk_gc_set_line_attributes(a->gdkgc,
r->rgrosor,
GDK_LINE_SOLID,
GDK_CAP_BUTT,
GDK_JOIN_MITER);
gdk_draw_rectangle(a->window->window, a->gdkgc, FALSE, r->rx, r->ry,
r->ranchura, r->raltura);
if (r->rfont != NULL)
gdk_draw_string (a->window->window, r->rfont, a->gdkgc, r->rx,
r->ry-5, r->rnombre);
}
void DibujarCirculo(aplicacion_t *a, circulo_t *c)
{
gdk_colormap_alloc_color(a->gdkcolormap, &c->ccolor, TRUE, TRUE);
gdk_gc_set_foreground(a->gdkgc, &c->ccolor);
gdk_gc_set_line_attributes(a->gdkgc,
c->cgrosor,
GDK_LINE_SOLID,
GDK_CAP_BUTT,
GDK_JOIN_MITER);
gdk_draw_arc(a->window->window, a->gdkgc, FALSE, c->cx, c->cy,
c->canchura, c->caltura, c->cangulo1, c->cangulo2);
//voy a dibujar el centro de la circumferencia
gdk_draw_point(a->window->window, a->gdkgc, c->ccentrox, c->ccentroy);
if (c->cfont != NULL)
gdk_draw_string (a->window->window, c->cfont, a->gdkgc, c->cx,
c->cy-5, c->cnombre);
}
gboolean EventoExponer(GtkWidget *widget,
GdkEventButton *event,
datos_t * datos)
{
if (event->type == GDK_EXPOSE)
DibujarLinea(datos->aplicacion, datos->linea);
DibujarRectangulo(datos->aplicacion, datos->rectangulo);
//DibujarCirculo(datos->aplicacion, datos->circulo);
return FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]