tin-dong
06-07-2005, 16:03
Hi Keute
Ich habe bei meinem Gtk-Programm ein paar Probleme. Es ist i soweit eigenftlich nicht kompliziert. Es kommen keine Kompilermeldungenungen und auch keine von GTK selber. Als ich es mit einem Debuggerversucht habe, kam nur
/*Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1091701680 (LWP 5958)]
0x4026e052 in gtk_type_check_object_cast () from /opt/gnome/lib/libgtk-1.2.so.0*/
Der Absturz kommt genau an der Stelle wo er das Pixbuf ins Fenster packen soll.Leider habe ich noch keine Erfahrung. Wisst Ihr vielleicht wo das Problem liegt.
Hier noch der wichtige Teile des Quellcodes. Es handelt sich um ein Programm welches mir Bilddaten aus einer Schnittstelle in einem Fenster ausgeben soll. Die Bilddaten kommen aus der Struktur als RAW-Daten.(daher die vielen Schleifen)
int HEIGHT = save_service->current_buffer->height;
int WIDTH = save_service->current_buffer->width;
unsigned char coimage[HEIGHT][WIDTH*3];
GdkPixbuf* copixbuf;
char *imagepointer;
int i,j,k;
GtkWidget *image_proc_window;
GtkWidget *vboxco3;
image_proc_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_object_set_data (GTK_OBJECT (image_proc_window), "image_proc_window", image_proc_window);
gtk_window_set_title (GTK_WINDOW (image_proc_window), _("Image-Processing"));
gtk_window_set_default_size (GTK_WINDOW (image_proc_window),350, 350 );
gtk_window_set_policy (GTK_WINDOW (image_proc_window), TRUE, TRUE, FALSE);
//gtk_widget_show (image_proc_window);
//vbox als Behälter für den Rahmen "im_proc_frame"
vboxco3 = gtk_vbox_new (FALSE, 0);
gtk_widget_ref (vboxco3);
gtk_object_set_data_full (GTK_OBJECT (image_proc_window), "vboxco3", vboxco3,
(GtkDestroyNotify) gtk_widget_unref);
gtk_container_add (GTK_CONTAINER (image_proc_window), vboxco3);
if (save_service == NULL)
printf("\nsave_service\n");
else if (save_service->current_buffer == NULL)
printf("\nsave_service->current_buffer\n");
else if (save_service->current_buffer->image == NULL)
printf("\nsave_service->current_buffer->image\n");
else {
printf("\nHeight = %d\n",HEIGHT );
printf("\nWidth = %d\n",WIDTH );
for (i=0; i<HEIGHT+1; i++) {
//printf("\v");
for (j=0; j<WIDTH+1; j++){
//printf("%d \t",coimage[i][j]);
for (k=0; k<3; k++){
coimage[i][j*3+k] = save_service->current_buffer->image[j+i*WIDTH];
}
}
}
printf("Wert vom Zeiger beim ersten objekt %d \n",coimage[0][0]);
imagepointer = &coimage[0][0];
printf("\nfor-Schleife Ok\n");
copixbuf = gdk_pixbuf_new_from_data (
(guchar *) imagepointer,//data,
GDK_COLORSPACE_RGB,//GdkColorspace colorspace,
0,//gboolean has_alpha,
8,//int bits_per_sample,
save_service->current_buffer->width,//int width,
save_service->current_buffer->height,//int height,
24,//int rowstride,//3*8bit für RGB
NULL,//GdkPixbufDestroyNotify destroy_fn,
NULL);//gpointer destroy_fn_data);
if (copixbuf==0)
printf("Can't create image with gdk !");
printf("\ncopixbuf Ok\n");
create_image_proc_window ();
printf("\ncreate_image_proc_window Ok\n");
sleep (3);
/*Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1091701680 (LWP 5958)]
0x4026e052 in gtk_type_check_object_cast () from /opt/gnome/lib/libgtk-1.2.so.0*/
gtk_container_add (GTK_CONTAINER (vboxco3), GTK_WIDGET (copixbuf));
//gtk_box_pack_start_defaults (GTK_BOX (vboxco3), GTK_WIDGET (copixbuf));
printf("\nin box packen Ok\n");
gtk_widget_show_all (GTK_WIDGET (image_proc_window));
printf("\nshow_image_proc_window Ok\n");
}
Schon mal Danke für eure Hilfe
tin-dong
Ich habe bei meinem Gtk-Programm ein paar Probleme. Es ist i soweit eigenftlich nicht kompliziert. Es kommen keine Kompilermeldungenungen und auch keine von GTK selber. Als ich es mit einem Debuggerversucht habe, kam nur
/*Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1091701680 (LWP 5958)]
0x4026e052 in gtk_type_check_object_cast () from /opt/gnome/lib/libgtk-1.2.so.0*/
Der Absturz kommt genau an der Stelle wo er das Pixbuf ins Fenster packen soll.Leider habe ich noch keine Erfahrung. Wisst Ihr vielleicht wo das Problem liegt.
Hier noch der wichtige Teile des Quellcodes. Es handelt sich um ein Programm welches mir Bilddaten aus einer Schnittstelle in einem Fenster ausgeben soll. Die Bilddaten kommen aus der Struktur als RAW-Daten.(daher die vielen Schleifen)
int HEIGHT = save_service->current_buffer->height;
int WIDTH = save_service->current_buffer->width;
unsigned char coimage[HEIGHT][WIDTH*3];
GdkPixbuf* copixbuf;
char *imagepointer;
int i,j,k;
GtkWidget *image_proc_window;
GtkWidget *vboxco3;
image_proc_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_object_set_data (GTK_OBJECT (image_proc_window), "image_proc_window", image_proc_window);
gtk_window_set_title (GTK_WINDOW (image_proc_window), _("Image-Processing"));
gtk_window_set_default_size (GTK_WINDOW (image_proc_window),350, 350 );
gtk_window_set_policy (GTK_WINDOW (image_proc_window), TRUE, TRUE, FALSE);
//gtk_widget_show (image_proc_window);
//vbox als Behälter für den Rahmen "im_proc_frame"
vboxco3 = gtk_vbox_new (FALSE, 0);
gtk_widget_ref (vboxco3);
gtk_object_set_data_full (GTK_OBJECT (image_proc_window), "vboxco3", vboxco3,
(GtkDestroyNotify) gtk_widget_unref);
gtk_container_add (GTK_CONTAINER (image_proc_window), vboxco3);
if (save_service == NULL)
printf("\nsave_service\n");
else if (save_service->current_buffer == NULL)
printf("\nsave_service->current_buffer\n");
else if (save_service->current_buffer->image == NULL)
printf("\nsave_service->current_buffer->image\n");
else {
printf("\nHeight = %d\n",HEIGHT );
printf("\nWidth = %d\n",WIDTH );
for (i=0; i<HEIGHT+1; i++) {
//printf("\v");
for (j=0; j<WIDTH+1; j++){
//printf("%d \t",coimage[i][j]);
for (k=0; k<3; k++){
coimage[i][j*3+k] = save_service->current_buffer->image[j+i*WIDTH];
}
}
}
printf("Wert vom Zeiger beim ersten objekt %d \n",coimage[0][0]);
imagepointer = &coimage[0][0];
printf("\nfor-Schleife Ok\n");
copixbuf = gdk_pixbuf_new_from_data (
(guchar *) imagepointer,//data,
GDK_COLORSPACE_RGB,//GdkColorspace colorspace,
0,//gboolean has_alpha,
8,//int bits_per_sample,
save_service->current_buffer->width,//int width,
save_service->current_buffer->height,//int height,
24,//int rowstride,//3*8bit für RGB
NULL,//GdkPixbufDestroyNotify destroy_fn,
NULL);//gpointer destroy_fn_data);
if (copixbuf==0)
printf("Can't create image with gdk !");
printf("\ncopixbuf Ok\n");
create_image_proc_window ();
printf("\ncreate_image_proc_window Ok\n");
sleep (3);
/*Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1091701680 (LWP 5958)]
0x4026e052 in gtk_type_check_object_cast () from /opt/gnome/lib/libgtk-1.2.so.0*/
gtk_container_add (GTK_CONTAINER (vboxco3), GTK_WIDGET (copixbuf));
//gtk_box_pack_start_defaults (GTK_BOX (vboxco3), GTK_WIDGET (copixbuf));
printf("\nin box packen Ok\n");
gtk_widget_show_all (GTK_WIDGET (image_proc_window));
printf("\nshow_image_proc_window Ok\n");
}
Schon mal Danke für eure Hilfe
tin-dong