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
}

Deleted
()
Ответ на: комментарий от 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);
}));

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

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

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

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

Deleted
()
Ответ на: комментарий от Deleted
(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
() автор топика
Ответ на: комментарий от Deleted

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

iluha16
()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

metaprog
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.