Hi!
Ich habe zwei Fragen zur Kombination aus Ruby und C. Die zweite Frage hat eine reine C-Unterfrage. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Das Buch "Programming Ruby" mag zwar sehr gut sein, aber bei diesem Thema etwas unvollständig. Und Japanisch kann ich leider nicht so gut...
1.)
Ich möchte von C aus eine Ruby-Funktion aufrufen. Also eine, die nicht innerhalb von einer Klasse definiert wurde. Man muss aber bei den Aufrufen aus C heraus ein Objekt angeben, dass als Empfänger fungiert. Ein einfaches "puts self" gibt da "main" aus, und ich habe herausgefunden, dass main vom Typ Object ist (in C also rb_cObject). Nur wie komme ich an dieses Objekt ran? rb_gv_get("main") funktioniert jedenfalls nicht. Statt rb_funcall() könnte ich zwar rb_eval_string() verwenden, aber das muss doch auch "normal" gehen.
2.)
Ich möchte den Ruby-Interpreter in ein C-Programm einbetten. Dabei soll Ruby-Code aus einer Datei ausgeführt werden, doch das Programm soll nicht komplett beendet werden, wenn der Ruby-Interpreter die Datei verarbeitet hat. Mit rb_load_file() die Datei zu laden und per ruby_run() loszulegen funktioniert also nicht.
Muss ich hier den Code manuell einlesen (Wie liest man am besten in C eine ganze Datei in einen einzelnen String ein? Per mmap()?) und dann selbst rb_eval_string() darauf loslassen? Wird das funktionieren, d.h. kommt rb_eval_string() mit Newlines klar? Gibt es eine halbwegs elegante Lösung, weil das wäre ja irgendwie grässlich, wenn ich das so lösen müsste.
Cheers,
Wolfgang
Ruby und C
Re: Ruby und C
Hi!
Heute wurde mir schlagartig klar, wie ich sehr einfach eine Datei verarbeiten lassen kann: Es geht mit
rb_eval_string ("require ('brim_config.rb')");
Damit kann ich leben.
Cheers,
Wolfgang
Heute wurde mir schlagartig klar, wie ich sehr einfach eine Datei verarbeiten lassen kann: Es geht mit
rb_eval_string ("require ('brim_config.rb')");
Damit kann ich leben.
Cheers,
Wolfgang
Re: Ruby und C
Hi nochmal!
Falls es mal jemanden interessieren sollte: Noch einfacher ist rb_require(). Ich wollte übrigens Ruby zusammen mit pthreads verwenden, aber das ist nicht möglich, der Ruby-Interpreter dreht dabei durch. Man muss Rubys eigenes Threading verwenden. Das sieht dann so aus:
Datei in einen Thread abarbeiten lassen geht ziemlich simpel per
VALUE script_thread = rb_thread_create (rb_require, (void *) script_name);
Um dann auf den Thread zu warten, ist nur ein
VALUE result = rb_funcall (script_thread, rb_intern ("value"), 0);
nötig. Statt "value" kann man auch "join" verwenden, wenn man nicht am Rückgabewert interessiert ist.
Cheers,
Wolfgang
Falls es mal jemanden interessieren sollte: Noch einfacher ist rb_require(). Ich wollte übrigens Ruby zusammen mit pthreads verwenden, aber das ist nicht möglich, der Ruby-Interpreter dreht dabei durch. Man muss Rubys eigenes Threading verwenden. Das sieht dann so aus:
Datei in einen Thread abarbeiten lassen geht ziemlich simpel per
VALUE script_thread = rb_thread_create (rb_require, (void *) script_name);
Um dann auf den Thread zu warten, ist nur ein
VALUE result = rb_funcall (script_thread, rb_intern ("value"), 0);
nötig. Statt "value" kann man auch "join" verwenden, wenn man nicht am Rückgabewert interessiert ist.
Cheers,
Wolfgang