Как новичок, я за короткое время создал код GTK 3 Fortran Code, близкий к примерам для построения линий в области рисования, запускаемой кнопкой. Построение графика осуществляется через g_signal_connect в функции draw. К сожалению, это работает с моим Кодом только для сигнала "рисовать" из области рисования. Сигнал, «нажатый» от кнопки, приводит к недействительной ссылке на память. Как я могу преодолеть эту проблему? Спасибо за помощь и извините за банальный вопрос. Я нашел разные темы для похожих вопросов, но не нашел решения в Фортране.
! GtkWidget event:
function draw (widget, my_cairo_context, gdata) result(ret) bind(c)
use iso_c_binding, only: c_ptr, c_int
implicit none
integer(c_int) :: ret
type(c_ptr), value :: widget, my_cairo_context, gdata
call cairo_set_source_rgb(my_cairo_context, 1d0, 0d0, 0d0)
call cairo_set_line_width(my_cairo_context, 0.5d0)
call cairo_move_to(my_cairo_context, 50d0, 5d0)
call cairo_line_to(my_cairo_context, 150d0, 150d0)
call cairo_stroke(my_cairo_context)
ret = FALSE
end function draw
program gtkFortran
call gtk_init ()
! Create a window:
window = gtk_window_new (GTK_WINDOW_TOPLEVEL)
call gtk_window_set_default_size(window, 500, 500)
call gtk_window_set_title(window, "Press Start For Plotting"//c_null_char)
call g_signal_connect (window, "destroy"//c_null_char, c_funloc(destroy))
! Create a grid:
table = gtk_grid_new ()
call gtk_grid_set_column_homogeneous(table, TRUE)
call gtk_grid_set_row_homogeneous(table, TRUE)
call gtk_widget_set_margin_start (table, 10_c_int)
call gtk_widget_set_margin_end (table, 10_c_int)
call gtk_widget_set_margin_top (table, 10_c_int)
call gtk_widget_set_margin_bottom (table, 10_c_int)
call gtk_container_add (window, table)
! Create a drawing-area:
area = gtk_drawing_area_new()
call gtk_grid_attach(table, area, 0_c_int, 6_c_int, 3_c_int, 6_c_int)
call g_signal_connect (area, "draw"//c_null_char, c_funloc(draw))
call gtk_widget_queue_draw_area (area, 0_c_int, 6_c_int, 3_c_int, 6_c_int)
! Create a button:
button = gtk_button_new_with_label ("Start"//c_null_char)
call gtk_grid_attach(table, button, 0_c_int, 0_c_int, 1_c_int, 1_c_int)
call g_signal_connect (button, "clicked"//c_null_char, c_funloc(draw))
call gtk_widget_show_all (window)
call gtk_main ()
end program gtkFortran