Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Использование Ruby как встроенного языка


Автор: skmdeveloper 3.10.2009, 14:30
Разрабатываю небольшую программку На Qt/C++.

В качестве расширений использую Ruby. 

Загружаю скрипт так:

Код

  ruby_script(filename);
    ruby_init_loadpath();
    rb_load_file(filename);
    ruby_exec();


Потом в нужном месте программы вызываю метод функцией класса Object  send.

Код

rb_funcall(self,rb_intern("send"),1,qtToRubyString(name)); // qtToRubyString()  - функция преобразования из данных из С++ в VALUE Ruby


Вообще то все работает. Только вот при синтаксических ошибках в скрипте выходит - [BUG] Segmentation fault и рушится все приложение.
В Debian и ArchLinux одно и то же.

Как это побороть, чтобы программа не вылетала?

Или Ruby не годится для этих целей?

Автор: GrayCardinal 3.10.2009, 17:24
Так синтаксические ошибки можно проверять... 
ruby -c 
если не ошибаюсь.........

Автор: skmdeveloper 3.10.2009, 17:41
Я не совсем точно выразился. Программа вылетает при любых ошибках, например вызове несуществующего метода.
У меня при открытии окна загружается скрипт и выполняется. Но если в скрипте что-то не так, то почему то рушится все приложение.

P.S. Сейчас сделал вызов функции не из кода на C++, а через eval. Хотя бы вменяемое сообщение об ошибке пишет. 





Автор: skmdeveloper 3.10.2009, 19:23
Нашел решение в инете.

Вместо  rb_eval_string(char*) нужно использовать 

То есть вместо 
Код

   rb_eval_string(qtToCString(s)); 


Нужно делать так

Код

    int status;
    rb_eval_string_protect(qtToCString(s), &status); // запуск защищенной функции
     if (status) {
          qDebug() << QString("Ruby eval failed : %1").arg(status);  // печать сообщения об ошибке
          qDebug() << QString("ruby $! : %1").arg(STR2CSTR(rb_inspect(rb_gv_get("$!"))));
     }



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)