LINUX.ORG.RU

ЯтЪ - gtk_file_chooser_dialog_new

 ,


0

2

Всем привет, пытаюсь бороться с gtk_file_chooser_dialog_new, всё с ним работает, но весит постоянно варнинг:

ui.c:44: предупреждение: passing argument 2 of 'gtk_file_chooser_dialog_new' from incompatible pointer type [enabled by default]
                                           NULL);
                                           ^

Текст функции такой:

void click_browse_key(GtkButton *button, gpointer data) {

    GtkWidget *dialog = gtk_file_chooser_dialog_new ("Открыть ключ",
                                          window,
                                          GTK_FILE_CHOOSER_ACTION_OPEN,
                                          ("_Отмена"),
                                          GTK_RESPONSE_CANCEL,
                                          ("_Открыть"),
                                          GTK_RESPONSE_ACCEPT,
                                          NULL); // Тут варнинг

    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
        gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
        gtk_entry_set_text(GTK_ENTRY(key_edit), filename);
        g_free(filename);
      }

    gtk_widget_destroy (dialog);
}

CMake такой:

cmake_minimum_required(VERSION 3.5)
project(mqt C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-incompatible-pointer-types -Wno-unused-result")

# Используем PkgConfig для поиска GTK+ хидеров и библиотек
FIND_PACKAGE(PkgConfig REQUIRED)
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)
FIND_PACKAGE(OpenSSL REQUIRED)
FIND_PACKAGE(PTHREAD REQUIRED)

# Подключаем найденные файлы
INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS})
LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS})

# Доп.флаги компиляции
ADD_DEFINITIONS(${GTK3_CFLAGS_OTHER})
ADD_DEFINITIONS("-DWITH_TLS")
ADD_DEFINITIONS("-DWITH_SOCKS")
ADD_DEFINITIONS(-pthread)

# Файлы проекта
set(SRC_FILES main.c ...)

# Доп.файлы для линковки
set(LINK_LIBS разные.so)
add_executable(${PROJECT_NAME} ${SRC_FILES} )
target_link_libraries(${PROJECT_NAME} ${LINK_LIBS} ${GTK3_LIBRARIES})

Собсна как избавиться от варнинга? И собсна почему не сработал -Wno-incompatible-pointer-types? Спасибо

★★★★

ui.c:44: предупреждение: passing argument 2 of 'gtk_file_chooser_dialog_new'
    GtkWidget *dialog = gtk_file_chooser_dialog_new ("Открыть ключ",
                                          window,

Так ты же не показал, какого типа window.

gag ★★★★★
()

Я не знаток GTK (и вообще его не переношу), поэтому могу ошибаться, но оно тебе пишет: «passing argument 2… from incompatible pointer type». А второй аргумент у тебя не NULL, а window

XMs ★★★★★
()
Ответ на: комментарий от gag

Так ты же не показал, какого типа window.

static GtkWidget *window;
...

    builder = gtk_builder_new();
...
    window = GTK_WIDGET(gtk_builder_get_object(builder, "MainWindow"));
AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF
static GtkWidget *window;

Ну вот, а посмотри, какого должно быть:

gtk_file_chooser_dialog_new ()

GtkWidget *
gtk_file_chooser_dialog_new (const gchar *title,
                             GtkWindow *parent,
                             GtkFileChooserAction action,
                             const gchar *first_button_text,
                             ...);
И для этого в Gtk есть cast-макросы.

gag ★★★★★
()
Ответ на: комментарий от XMs

О дошло =) Спасибо огромное, мне почему-то казалось что проблема была в двух последних аргументах =) Вылечил дописав (GtkWindow*) перед window.

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Вылечил дописав (GtkWindow*) перед window

gag пишет, что для кастов есть специальные макросы, подозреваю, что лучше использовать их

XMs ★★★★★
()
Ответ на: комментарий от XMs

И в давайте начнём официальной Gtk доки их нельзя не заметить.

лучше использовать их

Потому что в отличие от насильного сишного каста эти включают проверку от дурака при компилировании.

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 1)
Ответ на: комментарий от Dron

Можно и так, но лучше использовать каст-макрос, GTK_WINDOW(window)

Чем лучше то, если написано, что функции требуется такой вид, (GtkWindow *)window.

u0atgKIRznY5
()
Ответ на: комментарий от XMs

gag пишет, что для кастов есть специальные макросы, подозреваю, что лучше использовать их

Действительно, чёт я сегодня тупой

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от gag

Потому что в отличие от насильного сишного каста эти включают проверку от дурака при компилировании.

Спасибо

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Посмотри на реализацию этого макроса.

anonymous
()

!latin1 в коде??! да тут вообще ретроактивный аборт нужен, а не просто «я сегодня тупой» срочно Линуса в тред Linus!

anonymous
()
Ответ на: комментарий от AntonyRF

В кириллице же. Напомню, что в Си и производных восклицательный знак перед выражением означает логическое отрицание, а значит, «!latin1»==«не latin1». Символы кириллицы, очевидно, в latin1 не входят

XMs ★★★★★
()
Ответ на: комментарий от AntonyRF

выше объяснили :)

(я, если что, не считаю локализованные комментарии в личном коде проблемой, главное что бы исходиники были в utf8)

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от XMs

Я бы так и подумал, если бы написали !«latin1» =)

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Тем что

#define GTK_WINDOW(obj)  (GTK_CHECK_CAST ((obj), GTK_TYPE_WINDOW, GtkWindow))

По мимо приведения идёт ещё и проверка. Это специальные макросы для приведения типов gtk виджетов.

если написано, что функции требуется такой вид

Так можно, но не далеко не всегда нужно, каст-макросы придумали специально для того что бы избежать ошибок и правильного приведения типа для обрабатывающей функции.

Dron ★★★★★
()
Ответ на: комментарий от Deleted

я, если что, не считаю локализованные комментарии в личном коде проблемой, главное что бы исходиники были в utf8

Солидарен с Вами =)

Ну в общем всем спасибо, вопрос закрыт =)

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от a1batross

ткните носом в список параметров которые поддерживает target_compile_options, а то не могу нагуглить как использовать в моём случае

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Все. О_о

Он их просто отдаёт компилятору, без проверки на то, поддерживает он их или нет.

Это не к решению твоей проблемы, просто лучше делать так, чем пропихивать параметры в CMAKE_C_FLAGS или в add_definitions.

a1batross ★★★★★
()

Внезапно, а в чём необходимость писать на C? GTK+ поддерживает кучу языков, в том числе C++ (gtkmm) и Vala, который в процессе компиляции преобразуется в тот же C и работает с библиотекой libgtk без прослоек. А так же божественный, хоть и интерпретируемый python с pygi. Почему именно C?

eternal_sorrow ★★★★★
()
Ответ на: комментарий от bodqhrohro_promo

Потому что это шлак. Код трудночитаем, легко допустить ошибку и трудно найти, костыль на костыле и костылём погоняет.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

GTK+ поддерживает кучу языков, в том числе C++ (gtkmm) и Vala

Ну тогда уж сразу Rust, ведь С++ это шлак. Код трудночитаем, легко допустить ошибку и трудно найти, костыль на костыле и костылём погоняет.

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

Код трудночитаем

Потому что ты не сишник. Найди текст на каком-нибудь чероки, попробуй прочесть и отпишись потом о трудночитаемости.

легко допустить ошибку и трудно найти

Оно везде так, если ты пишешь что-то сложнее круда.

костыль на костыле и костылём погоняет

Легаси, щито поделать. Зато эти костыли хорошо известны и не меняются десятилетиями, не то что во всяких хипсторских язычках, в которых каждый год что-то ломают или выкидывают и надо успевать за всем уследить ещё.

bodqhrohro_promo
()
Ответ на: комментарий от bodqhrohro_promo

C из коробки чреват кучей питфолов.

Может я не совсем Вас понял, питфол это типа PID FAULT?

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Pit fall — «падение в яму». Иже расставленные по пути капканы и ловушки, готовые поймать чуть оступившегося незадачливого сишника. Одни из самых типичных — обратиться по указателю на мёртвый контекст или не проверить размер буфера.

bodqhrohro_promo
()
Ответ на: комментарий от bodqhrohro_promo

Понятно. Ну всё равно Си простой и программировать на нём можно, большая часть ошибок встречается только пока учишься, а другая часть ошибок избегается всякими правилами программирования. Конечно, на 100% не убережёт, но как-то марсоходы передвигаются же.

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

С++ это шлак

тут во многом соласен, но всё же если это не зубодробительные шаблоны, то код на C++ гораздо лучше читаем, чем на C. А если не пользоваться C-шными указателями, массивами, строками и ручным управлением памятью (не писать в C-стиле на С++, на прикладном уровне это не нужно так же как чистый С), то выстрелить в ногу шансов гораздо меньше.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Ну так-то на Rust + Gtk я тож программирую =)

А вообще не вижу смысла юзать С++ или Rust там где можно быстро сделать на Си. Если инструмент подходит для задачи то чёб и нет?!

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

А у него есть полноценные биндинги к библиотекам из стека Gobject

Ну не совсем полноценные, ещё нет ни одной мажорной версии ни одной из библиотек которые поддерживали бы GTK в Rust

AntonyRF ★★★★
() автор топика
23 ноября 2017 г.
Ответ на: комментарий от AntonyRF

ещё нет ни одной мажорной версии

В каждом отдельном случае это означает разные вещи. Я не думаю что это что-то гарантирует

https://github.com/gtk-rs/gtk

Тут вроде 1835 коммитов и 60 контрибьюторов. Это уже неплохо

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Потому что это шлак. Код трудночитаем, легко допустить ошибку и трудно найти

Ой, а цепепе код будет чистый и понятный, отладка божественной. Лол! Или может в инопланетном расте иероглифы карябать прикажешь? Не, мы уж как то по-старинке. Для прототипа разрешаю пытон.

bread
()
Ответ на: комментарий от vertexua

Я смотрю, на этой неделе стало модно поднимать мои некро-посты? =)

А по теме gtk-rs использовать можно конечно, но сложновато КМК

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от bread

цепепе код будет чистый и понятный

не идеал конечно, уродский синтаксис шаблонов всё портит, но уж точно лучше, чем на С

отладка божественной

ну не хуже чем на С точно

инопланетном расте

чем он инопланетный?

если ты хочешь чистый и понятный код, я предложил варианты - python, vala

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.