next up previous contents index
Search Next: Ruby-Interpreter einbauen Up: Ruby "`einbetten"' Previous: Ruby "`einbetten"'   Contents   Index

Externe Funktionen aufrufen

Das erste Beispiel zeigt, wie man aus einem C-Programm eine Ruby-Methode aufrufen kann - und umgekehrt!

Zuerst der recht simple C-Code:

/* Datei: embedding.c */
#include "ruby.h"

static VALUE sendeGrussAnC(VALUE self, VALUE str)
{
  printf("Ruby hat uns den Gruss gesendet: %s\n",
          StringValuePtr(str));
}

int main (int argv[], int argc)
{
  VALUE cModul;
  VALUE gruss;

  printf("Ein Hallo von C\n");
  ruby_init; // Dieser Aufruf ist zwingend
  cModul = rb_define_module("CModul");
  rb_define_module_function(cModul,
    "sendeGrussAnC", sendeGrussAnC, 1);

  rb_require("./embedding.rb"); // Ruby-Modul laden
  // C-String -> Ruby-Objekt
  gruss = rb_str_new2("Es Gruessli von C");  

  rb_funcall(cModul, rb_intern("sendeGrussAnRuby"),
             1, gruss);
  ruby_run;
}

Erst durch rb_define_module_function wird die C-Funktion sendeGrussAnC in Ruby zugänglich. In einer C++-Anwendung empfiehlt sich das Facade-Entwurfsmuster [GOF94], um die gewünschte Schnittstelle zusammenzustellen.

Das Ruby-Skript embedding.rb enthält:

# Datei : embedding.rb
print("Ein Hallo von Ruby\n")

module CModul
  def CModul.sendeGrussAnRuby(grussVonC)
    print ("C hat uns einen Gruss geschickt: 
           #{grussVonC}\n")
  end
end

CModul.sendeGrussAnC("Aloah von Ruby")

Die Ausgabe hierzu sieht wie folgt aus:

$ ./embedding.exe
Ein Hallo von C
Ein Hallo von Ruby
Ruby hat uns einen Gruss gesendet: Aloah von Ruby
C hat uns einen Gruss geschickt: Es Gruessli von C



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20