首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gtk_adjustment_get_value分段故障

gtk_adjustment_get_value分段故障
EN

Stack Overflow用户
提问于 2014-01-10 10:17:17
回答 1查看 173关注 0票数 0

我正在尝试用C语言编写一些简单的代码,使用GTK+和Cairo,但我在使用gtk_adjustment_get_value函数时遇到了一些问题。

这是我的代码:

代码语言:javascript
复制
#include <cairo.h>
#include <gtk/gtk.h>
#include <math.h>
#include <stdlib.h>
#include <gtk/gtkhscale.h>
#include <math.h>

typedef struct
{
  GtkAdjustment *adj[2];    //Adjustments para as escalas
  GtkWidget *scale[2];      //Escalas
} ProgInfo;

gboolean
on_expose_event (GtkWidget *widget, 
             GdkEventExpose *event, 
         gpointer data)
{
  cairo_t *cr;
  double pos1x, pos1y;
  static gdouble pos2x = 450., pos2y = 290.; //Coordenadas Espelho
  static gdouble pos3x = 450., pos3y = 250.;
  ProgInfo *pinfo;

  cr = gdk_cairo_create(widget->window);

  pinfo = (ProgInfo *) data;

  pos1x = gtk_adjustment_get_value (pinfo->adj[0]);

  //Objecto

  cairo_set_source_rgb (cr, 0, 0, 0);
  cairo_set_line_width (cr, 1.0);
  cairo_rectangle (cr, (double) pos1x, (double) pos1y, 20, 80);
  cairo_stroke_preserve (cr);
  cairo_set_source_rgb (cr, 1, 1, 1);
  cairo_fill (cr);

  cairo_set_source_rgb (cr, 0, 0, 0);
  cairo_set_line_width (cr, 1.0);
  cairo_rectangle (cr, (gint) pos3x, (gint) pos3y, 5, 80);
  cairo_stroke_preserve (cr);
  cairo_set_source_rgb (cr, 1, 1, 1);
  cairo_fill (cr);

  cairo_stroke(cr);
  cairo_destroy(cr);

  return FALSE;
}


int main (int argc, char *argv[])
{

  GtkWidget *window, *vbox, *vbox1, *frame, *frame1, *frame2, *label, *label1, *label2, *hbox, *hbox1, *hscale;
  char string[40] = "Posição Objecto", string1[30] = "Posição Espelho";
  ProgInfo *pinfo;
  gdouble pos1x;
  pinfo = (ProgInfo *) calloc (1, sizeof (ProgInfo));

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  g_signal_connect (window, "expose-event", G_CALLBACK(on_expose_event), NULL);
  g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title (GTK_WINDOW(window), "Projecto Óptica");
  gtk_window_set_default_size (GTK_WINDOW(window), 800, 600); 
  gtk_widget_set_app_paintable (window, TRUE);

  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (window), vbox);

  hbox1 = gtk_hbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (vbox), hbox1);

  vbox1 = gtk_vbox_new (FALSE, 0);
  gtk_box_pack_end (GTK_BOX (hbox1), vbox1, FALSE, FALSE, 20);

  //Posição Objecto
  label2 = gtk_label_new (string);
  gtk_box_pack_start (GTK_BOX (vbox1), label2, FALSE, FALSE, 20);

  pinfo->adj[0] = (GtkAdjustment *) gtk_adjustment_new (0.7, 0.0, 1.0, 0.001, 1.0, 0.0);
  //Os parâmetros são, por ordem: valor inicial, valor mínimo e valor máximo
  pinfo->scale[0] = gtk_hscale_new (GTK_ADJUSTMENT (pinfo->adj[0]));
  gtk_box_pack_start (GTK_BOX (vbox1), pinfo->scale[0], FALSE, TRUE, 5);

  //Posição Espelho
  label1 = gtk_label_new (string1);
  gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 20);

  pinfo->adj[1] = (GtkAdjustment *)gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
  pinfo->scale[1] = gtk_hscale_new (GTK_ADJUSTMENT (pinfo->adj[1]));
  gtk_box_pack_start (GTK_BOX (vbox1), pinfo->scale[1], FALSE, FALSE, 0);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

我用hscale小工具创建了几个滑块,它们在窗口中显示得很好,我可以移动它们,一切都很好。但是我想让我的变量pos1x在我移动滑块的时候改变。我尝试使用gtk_adjustment_get_value函数来做这件事,但是我得到了一个分段错误。我注意到,如果我注释掉这一行:

代码语言:javascript
复制
  pos1x = gtk_adjustment_get_value (pinfo->adj[0]);

分割错误不再发生,但应用程序也不会执行我想要的操作。我意识到这可能非常简单,我的怀疑源于对GTK+如何工作的了解很少,但我已经尝试了几个小时,我不知道哪里出了问题。如果你能提供任何帮助,我将不胜感激。

哦,很抱歉在这里放了这么大的代码块,但我不确定你需要哪些部分。

EN

回答 1

Stack Overflow用户

发布于 2014-01-10 17:38:48

在这里连接到expose-event时,将userdata指针设置为NULL:

代码语言:javascript
复制
g_signal_connect (window, "expose-event", G_CALLBACK(on_expose_event), NULL);

但在处理程序中,您希望它是指向ProgInfo的指针。您应该用pinfo替换NULL

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21035087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档