На этом уроке мы напишем программу с графическим интерфейсом - окошко с сообщением.
Попробуйте закомментировать каждую строчку по отдельности, перекомпилируйте и запустите - что изменилось?
Напишите свои выводы в комментариях.
Дата отправки отчёта:
29 декабря 2018 г.
Задание выполнено: за
1 час. 4 мин.
Чему научился:
Давненько компьютер не ловил кучу segmentation fault, как во время выполнения этого урока. А всё дело в том, что по заданию требовалось комментировать по очереди каждую строчку программы и это выдавало весьма причудливые результаты. На первом скриншоте программа без комментариев, на втором с закомментированным добавлением метки на форму.
По заданию требовалось описать результаты экспериментов по комментированию каждой строчки, ниже результаты.
1: #include <gtk/gtk.h> Ошибка компиляции. Ух, куча предупреждений, ошибки об обсутствующих функциях, макросах. Поди да и разберись в этом, а все лишь из-за того, что не включил заголовочный файл...
2: пустая строка Компилируется, запускается, все работает. А чего вы хотели, если закомментировать пустую строку? :)
3: int main(int argc, char *argv[]) Ошибка компиляция. Компилятор намекает, что должно быть что-то перед открывающейся скобкой, которая идет ниже, на 4 строке.
4: { Ошибка компиляции. Куча различных сообщений, причем разного характера, в основном касаются того, что я пытаюсь использовать выражения не в том месте, вне функции, так нет открывающейся скобки.
5: GtkWidget *frame, *label; Ошибка компиляции, не были объявлены переменные frame, label.
6: gtk_init(&argc, &argv) Программа компилируется, при запуске ловит Segmentation fault, так как не была выполнена инициализация GTK.
7: frame = gtk_window_new(GTK_WINDOW_TOPLEVEL) Успешная компиляция, после запуска выдает предупреждения о неуспешной попытке работать с объектом frame. Окно программы не показывается, но программа работает. Для завершения Ctrl+C.
8: gtk_window_set_title(GTK_WINDOW(frame), "Hello, Java!"); Программа компилируется, запускается, работает. Ошибок нет. Узнал для себя новое - если не указать заголовок окна, то вместо него пишется имя исполняемого файла. Мелочь, а приятно узнать:)
9: label = gtk_label_new("Welcome!"); Компиляция успешна. А дальше Segmentation fault! Вот тут удивило. В отличие от 7, где программа тихо-мирно как-то пыталась работать без окна приложения.
10: gtk_container_add(GTK_CONTAINER(frame), label); Программа компилируется, запускается, работает, ошибок нет. Все на месте, кроме метки :) Так как её не добавили на форму.
11-12: g_signal_connect(G_OBJECT(frame), "destroy", G_CALLBACK(gtk_main_quit), NULL); Программа компилируется, запускается, работает, ошибок нет. Ну... почти нет ошибок, кроме одной логической. При попытке закрыть приложение, нажав на крестик, кликнув на пункт меню или даже Alt+F4, окно закрывается, но приложение работает!
13: gtk_window_set_default_size(GTK_WINDOW(frame), 250, 100); Все почти окей - компилируется, запускается, метка на месте, успешно закрывается. Проблема в том, что в GTK используется динамическая компоновка виджетов и размер окна подгоняется под минимальный необходимый размер для отображения элементов. Поэтому окно очень маленькое - но метку Welcome видно полностью :)
14: gtk_widget_show_all(frame); Компиляция успешна, далее запускаю и... ничего, просто окно терминала, ожидающего заверешения работы программы. Окна приложения нет, так как мы не сказали GTK что нужно показать на экране.
15: gtk_main(); Компилиция успешна, программа запускается и сразу завершается. При комментировании этой строчки мы не попадаем в цикл обработки сообщений.
16: } Ошибка компиляции. Удивительно, он ожидает продолжения банкета! :) Ищет какое-нибудь объявление или выражение после 15 строчки.
Надеюсь, не слишком много букв. Спасибо за эксперименты, сам бы вряд ли так дурачился со своей программой :)