A problem when I insert a structure.



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]