Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода класса на C++ из скрипта на Ruby, подскажите как реализовать 
V
    Опции темы
BodyHolly
Дата 3.3.2007, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.3.2007

Репутация: нет
Всего: нет



Всем привет!

Столкнулся с задачей:
есть класс на С++, есть метод этого класса, возвращающий некоторое значение

Нужно написать скрипт на ruby, вызывающий этот метод класса и получить вычисленное значение метода

Посмотрел SWIG... А попроще вызов сделать нельзя?

Очень надеюсь на совет!
PM MAIL   Вверх
max_lapshin
Дата 3.3.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.9.2006
Где: Москва

Репутация: 2
Всего: 3



О. Я тебе, как автор 4 экстеншнов, про это могу рассказать.
Смотри: в C++ метод на объекте вызывается не волшебным образом, а через таблицу виртуальных функций (в общем случае). Ее поддержки в руби, есессно, нет. 

Решается это так: создается статическая функция, которая будет проксировать обращение к C++-методу.


Код

class A {
  int method(int param);
};

#define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f)

static void a_delete(A* a) {
  delete a; //обязательно так, иначе будет вызван free на памяти, полученной через new.
}
static VALUE a_allocate(VALUE klass) {
  A* a = new A();
  return Data_Wrap_Struct(klass, 0, a_delete, a);
}

static VALUE a_method(VALUE self, VALUE param) {
  A* a;
  Data_Get_Struct(self, A, a);
  return INT2NUM(a->method(NUM2INT(param))); // param разворачивается в int, передается методу, результат заворачивается в тип руби
}

VALUE cA; // Здесь хранится сам класс A, который будет жить в руби

void Init_A () {
  cA = rb_define_class("A", rb_cObject); // объявляется класс в руби
  rb_define_alloc_func(cA, a_allocate); // объявляется функция его аллокации
  rb_define_method(cA, "method", VALUEFUNC(a_method), 1); // объявляется метод экземпляра класса
}

PM MAIL WWW ICQ Jabber   Вверх
BodyHolly
Дата 3.3.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.3.2007

Репутация: нет
Всего: нет



Спасибо :-) Интересный способ
PM MAIL   Вверх
max_lapshin
Дата 3.3.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.9.2006
Где: Москва

Репутация: 2
Всего: 3



А другого способа нет чисто теоретически. SWIG к этому же сводит, но свиг — это способ к которому у меня много претензий.
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.