PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gtk-Programm sollte funktionieren, tut es aber nicht??



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

[0x[90]|
20-07-2005, 21:25
Sorry, wenn ich das so hart sagen muss, aber dein Code ist kompletter Muell.
Erstens: Wenn du GTK benutzt, benutze bitte auch die glib. GTK selber nutzt sie und dies nicht nur aus jux. Das was dir wiederfahren ist, ist einfach ein Segmentation Fault, warscheinlich weil du auf Speicher zugreifst, der dir nicht gehoert. Ich wuerde mir die Muehe machen, den Code genau anzusehen, wenn du dir die Muehe gemacht haettest, ihn in code-tags zu setzen und wie bereits schon erwaehnt, mit glib zu arbeiten. Bitte verstehe mich nicht falsch, es ist kein Angriff gegen dich, aber es wuerde nichts bringen wenn sich jemand diesen Code anguckt und dir die Fehler zeigt, da das Programm vom Ansatz her schon misserabel geschrieben ist und ich kein Foerderer von schlecht-programmiertem Zeug bin :)
Befasse dich naeher mit der glib und gtk, schau dir kleine GTK programme an (gedit, das gnome-help center, den gnome-ausfuehren dialog, etc) und siehe dir an, wie sie aufgebaut sind. Danach versuche das ganze nochmal schoen und sauber. Es wird dir auch bei der Fehlersuche helfen.

Bye