Задать вопрос
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Антон Жилин: так его не нужно поддерживать, он автоматически генерируется. Поддерживать нужно только генератор. Если и использовать что-то готовое, то для моего случая скорее всего больше подошел бы zephir: https://zephir-lang.com
    Про Swing не знал (хотя где-то мельком слышал о нём, но не придавал значения). Примеры из документации глянул. Мне кажется в итоге бы все уперлось в несовместимость с Qt, начиная от connect(signal -> slot), заканчивая свойствами классов, т.к. в Qt свойства классов имеют собственную реализацию.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    AtomKrieg: PyQt - это питон. Решил оставить его для питонщиков :)
    А так да, по сути там делается тоже самое, только другими методами.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    kakker: Антон Жилин: еще хочу добавить, что раньше такая функция генерировалась метакомпилятором Qt. Для того чтобы это сделать, нужно было создавать копии классов (обёртки), копировать все методы и приписывать к ним макрос Q_INVOKABLE. Тела методов были всего в одну строку: вызов родительского метода с теми-же параметрами.
    Такой подход нельзя было применить к простым классам, не являющимися наследниками QObject, например, к QPoint, QRect, QImage и т.д. для них приходилось дополнительно наследовать обертку класса от QОbject, добавлять макрос Q_OBJECT.
    Из-за этого размер библиотеки получался очень большим, а создавать копии классов было не совсем удобно и это занимало много времени. Сейчас эта функция генерируется в обход QtMOC, работать с ней можно без QMetaObject и QObject вообще, а сами объекты не имеют дополнительных реализаций: если я хочу создать QObject, то создаю QObject, а не его копию-обёртку. Можно даже создать описание для любого класса любой библиотеки, не входящей в состав Qt.
    Информации об объектах стало на много больше, но размер библиотеки уменьшился.
    В итоге я точно так-же могу исполнять текстовые команды, но библиотека стала полностью независимой от QMetaObject. Над реализацией, конечно, еще предстоит поработать.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Антон Жилин: эта функция не совсем "центральная", такая функция есть для всех классов, с которыми предполагается работать.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Антон Жилин: грубо говоря, я могу создать текстовый файл с набором команд и запустить его на исполнение без компиляции - это, скажем так, и есть самый верхний уровень. Данная функция - это самый нижний уровень (в рамках моего проекта). Ни сетью, ни сериализацией это не связано.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Антон Жилин: эта функция выполняет текстовые команды. По сигнатуре функции "move(int,int)" программа определяет её индекс (83). Далее программа создает массив StackItem, закидывает туда нужные значения (int и int) и вызывает команду move() у объекта. Если функция что-то возвращает, то это значение передается отправителю, а отправитель в свою очередь может передать это значение другой команде или объекту. Команды поступают в рантайме.
    Роль этой функции - просто вызвать нужный метод/конструктор/деструктор, когда от нее это потребуют. Она "тупая" и ничего больше делать не умеет, все проверки на передаваемые значения и возможность их преобразования в другие типы делает другая функция. Поэтому здесь так много reinterpret_cast, т.к. особого волнения по поводу валидности значений быть не должно.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Ринат Велиахмедов: я конечно допускаю, что мой код далеко не идеал, и уверен, что, в принципе, подобный код мало где может встретится либо применяться, НО если следовать вашей логике, то вся библиотека Qt - это одна сплошная бредовая архитектура.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    AtomKrieg: Value (у меня он называется Stack) - это по сути и есть свой variant. Но передавать он может только примитивы, указатели и указатели на указатели.
    Собственно, вот так реально выглядит сгенерированная функция: pastebin.com/Rr7LFZ28
    И это еще не самый сложный объект, как это можно было бы уместить в шаблонную функцию/класс? Мне кажется никак.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Я смотрел исходники Qt и делал свою реализацию QMetaObject. Отличие в том, что в Qt MOC при передаче параметров компилятор знает типы передаваемых значений (там используется либо QVariant, тесно связанный с метасистемой Qt, либо шаблонный класс QArgument). В моей же реализации типы - это строковые значения (не bool, а "bool"; не SomeObject, а "SomeObject"), поэтому компилятор оперирует указателями на void'ы. Есть процедуры, которые автоматически кастуют эти метаобъекты в другие типы, в случае необходимости (конечно, если это возможно). Я долго ломал голову как реализовать это все через базовые классы, либо через шаблоны, но ничего не вышло, то там, то тут возникали трудности в работе с иной реализацией.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    MiiNiPaa: хм, звучит убедительно :) да и выглядит не так адски как с malloc+memcpy. Спасибо.
    Копирование-то точно везде работало. Подправлю генератор и отпишусь как пройдет компиляция.
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    MiiNiPaa: да, не так выразился. В смысле я не знаю с какими именно параметрами/аргументами был создан объект, когда я обратился к методу someMethodOne();
    Погодите, а разве объект всегда может быть создан так:
    SomeTypeOne t1;
    SomeTypeOne* t2 = new SomeTypeOne(t1);

    Это ведь может быть только в том случае, если у него явно существует конструктор вида
    SomeTypeOne::SomeTypeOne(SomeTypeOne &other) {}

    или я не прав?
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Sharp: некоторые простые, некоторые с деструкторами.
    Сделал так:
    SomeTypeOne t = someObject->someMethodOne();
    value.ptr = (void*) malloc(sizeof t);
    memcpy(value.ptr, &t, sizeof t);


    Значения передаются, правда не знаю насколько это безопасно. А что не так со сложными объектами с деструктрами? Продолжите вашу мысль, пожалуйста :)
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    switch(value) {
    case 0: int i = 1; break;
    case 1: float f = 1.0f; break;
    }

    вот попробуйте скомпилировать это без фигурных скобок, а потом почитайте про основы c++ ;-)

    Я не могу понять куда я должен впихать этот new. Я не могу модифицировать код функции someMethodTwo() - это сторонняя библиотека к исходному коду которой у меня нет доступа. Функция возвращает объект, доступа к конструктору этого объекта у меня тоже нет.
    Допустим, я выделю память так:
    SomeTypeOne *t_ptr = (SomeTypeOne*) malloc(sizeof(SomeTypeOne));
    как мне теперь скопировать туда значение t?
  • Как сохранить жизнь переменной стека?

    @kakker Автор вопроса
    Ринат Велиахмедов: это не бред, а постановка задачи. Функция не может ничего возвращать, она работает с разными типами объектов, с разными типами данных и находится в отдельной библиотеке. В другой библиотеке есть такая же функция, которая делает тоже самое, но с другим набором объектов. В третей библиотеке еще одна и т.д и т.п. Библиотеки могут взаимодействовать между собой только через Value... но они "ничего не знаю друг о друге".

    Неужели вы думаете, что если бы была возможность унаследовать все имеющиеся типы от одного базового, могла бы возникнуть такая проблема? Библиотека работает с более чем с трёхстами типами значений, очень интересно как бы вы привели их какому-то базовому типу... :-) пока все работает, пока передаются примитивы (они тупо копируются) или указатели. А вот тут возникла сложность.