LINUX.ORG.RU

Metaprog: универсальная графическая среда программирования [в разработке] часть 5

 , , ,

Ответ на: комментарий от metaprog

А 32-битное использовал именно из-за того, что, кажется, size_t такой.

Нет, size_t он максимальный для массива на платформе.

Пока что оно у меня все сведено к примитивным типам.

sizeof возвращает size_t! %)

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define typeputs(a) puts(_Generic((a) ,\
							int : "int", \
                            long : "long", \
                            float : "float", \
                            size_t : "size_t", \
                            default : "other type"))

void main() {
	typeof(sizeof(int)) n = 10;
	typeputs(var);	// Выведет size_t
}

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

Как правильно передавать данные в колбек через gpointer?

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

Вот так можно передать int i:

void callback(GRandomObject *obj, void *user_data) {
	int *i = user_data;
	printf("%d\n", i);
}

GRandomObject *obj;
int i = 10;
g_signal_connect(obj, G_CALLBACK(callback), &i);
А вот так несколько переменных:
struct box {
	int a;
	int b;
};

void callback(GRandomObject *obj, void *user_data) {
	struct box *b = user_data;
	printf("%d, %d\n", b->a, b->b);
}

GRandomObject *obj;
struct box b = {10, 20};
g_signal_connect(obj, G_CALLBACK(callback), &b);
Если бы были замыкания то несколько переменных можно было бы передать вот так:
GRandomObject *obj;
int a = 10;
int b = 20;
g_signal_connect(obj, G_CALLBACK({
	printf("%d, %d\n", a, b);
}));

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

Я вот передаю указатель на текствью, а при выполнении выдает ошибку, что не тот виджет. Как передавать виджеты в колбеки?

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

Он не проверяет то что ты передаешь в каллбек, просто берешь и передаешь, покажи код на С, в другом чем то ошибка, или ты что то не так делаешь.

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

g_signal_connect это вообще макрос, помнишь вопросы по нему? Такой функции нет.

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

У меня вылетает твой пример... Скинь сообщение с ошибкой которое ты получаешь при запуске.

VarfolomeyKote4ka ()
Ответ на: комментарий от VarfolomeyKote4ka
(process:9105): Gtk-CRITICAL **: 09:12:47.541: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed

(process:9105): Gtk-CRITICAL **: 09:12:47.541: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed

(process:9105): Gtk-CRITICAL **: 09:12:47.541: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
Помилка адресування

Ошибка адресации. Неправильно передается указатель на виджет через гпоинтер.

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

Всего лишь хочется передать виджет как параметр колбека. Чтобы, допустим, при соединении с сокетом в нужный текствью писался текст.

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

Всего лишь хочется передать виджет как параметр колбека.

С этим нет никаких проблем, указатели легко передаются, трабла в чем то другом.

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

Да и помилки адресованья не должно быть! Там же типы проверяются, видимо что то со структурами не то у тебя, или количество аргументов не то что нужно для сигнала итд.

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

Да, проблема в другом - в функции задавания текста в текствью.

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

Нуль в задании длины не нужен, там размер задается жестко, отдельным параметром.

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

Тут другой баг. До того, как я делаю текствью прокручиваемым, там можно задавать строку, после - поинтер на него становится невалидным. Что делать? Доставать вложенный объект из прокручиваемого «окна»?

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

Попробуй выведи значение указателя [printf(«%p\n», ...)] на момент получения, и перед обращением где получается баг, сравни значения. Если отличаются - у тебя что то с аргументами. Если нет, то хз.

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

Указатель тот же до и после вписывания текствью в прокручиваемое окно, не менялся.

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

Всего лишь чуточку поменял очередность выполнения.

Так у тебя вроде бы инициализация gtk была после всего, а теперь стала в начале, как и должно быть.

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

Все работает. Проблемы были с интерфейсом колбека и нарушенным порядком выполнения (с инициализацией гтк).

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

Сходил, позырил диаграммки. Снова вижу вызовы GTKшных функций.

И вот вопрос: ЗАЧЕМ?

Зачем вещи, относящиеся к описанию UI, изображать лабвьюшными/метапроговскими диаграммами? Ведь есть же для них графические инструменты куда более подходящего вида — Glade, GtkBuilder, вот это всё. Там на картинке уже диалоговое окно изображено, можно таскать мышкой, дизайнить и т.д.

Другой вопрос — как UI повязать с логикой. Вопрос интересный.

Логику самого UI (типа, когда один чекбокс отключаем, несколько полей становятся недоступными) можно было бы изобразить специальными стрелочками поверх окна формы в самом дизайнере.

А вот логику программы... Можно, например, ещё одну стрелочку тянуть от кнопки к описанию метапроговской функции, которая вызывается при нажатии этой кнопки.

Вот это был бы наглядный подход. А так, как сейчас — забивание гвоздей микроскопом.

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

Скорее похоже на забивание шурупов молотком – вроде бы и можно, но жутко неудобно.

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

Нет. Статическая типизация. Суть была что не нужно прибивать гвоздями типы и функции в классы с инкапсуляцией.

так если ты эти функции будешь использовать исключительно для определённого класса в чём проблема. тебе нравится передавать указатель на this в списке аргументов?

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

нечитаемая хренотень. в текстовом коде всё видно как на ладони а тут надо кликать по каждому квадратику что бы выяснить что он делает если я правильно понимаю.

iluha16 ()

Может кто-нибудь дать ссылку на тот последний пример с циклами? Хочу добавить в репозиторий на гитлабе.

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

Навести мышкой чтобы всплыли подсказки к типам терминалов.

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

Можно и без указателя, просто прогонять саму структуру через функцию, ей оперирующую.

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

Тут пока до построения сложных интерфейсов далеко, абы работала сама логика.

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

так вот когда я вижу обычный код мне не надо ничего наводить потому что и так всё прекрасно видно

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

Чего сразу сложных? Для UI самое то.

А всякие циклы, рекурсии и ветвления лучше на вычислительных задачах отрабатывать, а не GTK тащить.

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

ну и зачем это всё? швырять саму струкруту по стэкам? а каже эффективность?

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

Еще посмотрим на практике. Возможно, лучше будет таки через указатели. Эксперимент - критерий истины.

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

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

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

Знал приблизительно. Но у меня-то ведь не делаются сишные подфункции кроме колбеков (и, возможно, рекурсии, но там и другие варианты есть). Метапроговские подфункции - всего лишь для удобства, на сишном уровне все инлайнится в main().

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

всё же не ясно почему нельзя «прибивать» методы и данные. по моему гораздо удобнее и организованнее смотрится s.length() вместо mb_strlen(s) как в пыхе.

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

А если у функции 2 параметра к какому из типов прибивать?

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

без конкретного примера затрудняюсь сказать. к тому к которому выглядит логичнее либо вообще не прибивать. но для таких методов как length/size, operator+ и т.д. почему бы не прибить. а в C++ ещё можно объявить ф-цию как friend и она будет иметь доступ к внутренностям объекта.

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

В визуальном подходе придется и так и так подключать терминалы. Так что зачем вообще заморачиваться с ООП?

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

что бы компилятор / угсп выдала сообщение об ошибке если типы данных не подходят / подключил по ошибке не к тому терминалу.

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

Метапрог и так будет показывать такие ошибки. Типизация статическая.

metaprog ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)