Почему кнопка GTK выдает: «Процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV)»? - PullRequest
0 голосов
/ 14 февраля 2020

GUI загружается и работает отлично. Я попытался заменить runBackup () на простой cout, и это тоже не работает. Я считаю, что проблема с моей кнопкой, как-то.

Функция:

namespace fs = std::filesystem;

static GtkWidget *backupDirs;
static GtkWidget *backupTo;
static GtkWidget *backupStatus_label;

void runBackup(GtkWidget *runBackup, gpointer data) {
    std::string backup = gtk_entry_get_text(GTK_ENTRY(backupDirs));
    std::ifstream backupFile(backup);
    std::string backupLocation = gtk_entry_get_text(GTK_ENTRY(backupTo));
    std::string line;
    while (getline(backupFile, line)) {
        fs::copy(line, backupLocation, fs::copy_options::recursive);
    }
}

кнопка:

runBackup = gtk_button_new_with_label("Begin Backup");
g_signal_connect(runBackup, "clicked", G_CALLBACK(runBackup), NULL);
gtk_grid_attach(GTK_GRID(grid), runBackup, 0, 4, 1, 1);

Ошибка:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

1 Ответ

0 голосов
/ 16 февраля 2020

Сложно сказать, не видя всей вашей программы, но, похоже, присвоив вашей переменной GtkButton runBackup то же имя, что и для обратного вызова runBackup, вы можете скрывать имя обратного вызова? То есть, когда вы подключаете сигнал к G_CALLBACK(runBackup), вы говорите ему выполнить обработчик сигнала по адресу вашего указателя данных GtkButton (очень опасно), а не по адресу вашей функции обратного вызова?

Получаете ли вы какие-либо предупреждения компилятора о преобразовании указателей данных в указатели функций?

...