[RESOLU] - [C++][ruby] extensions ou elipses

extensions ou elipses [RESOLU] - [C++][ruby] - C++ - Programmation

Marsh Posté le 28-07-2002 à 18:26:31    

Bon, le contexte : j'essaye de faire une extension pour ruby, mais au lieu de la faire en C je dois la faire en C++.
 
Le fichier ressemble a ca :

Code :
  1. #include "ruby.h"
  2. static VALUE simple_run(VALUE obj)
  3. {
  4.   return Qtrue;
  5. }
  6. void Init_simple(void)
  7. {
  8.     VALUE klass = rb_define_class("Simple", rb_cObject);
  9.     rb_define_method(klass, "run", simple_run, 0);
  10. }


 
Ca me sert juste a tester. En fait je défini une classe Simple avec la méthode run qui renvoie vrai.
 
Si je mets ce code dans un fichier avec un extension .c et que l'extension se compile avec gcc, ca passe sans probleme.  
Par contre, si je le mets dans un .cc ou equivalent et que je le compile avec g++ j'ai une sale erreur :
 
simpe.cc: In function `void Init_simple()':
simpe.cc:11: ANSI C++ prohibits conversion from `(long unsigned int)' to `(...)'
 
En fait, la fonction rb_define_method prends comme 3eme parametre
un pointeur de fonction, dont le prototype doit utiliser une ellipse (c'est comme ca que je comprends le ... dans l'erreur).
 
La question, c'est comment faire en sorte que ce code soit accepté par un compilateur C++, quelle est l'erreur en fait.
 
Edit: formattage


Message édité par lorill le 28-07-2002 à 23:17:54
Reply

Marsh Posté le 28-07-2002 à 18:26:31   

Reply

Marsh Posté le 28-07-2002 à 18:45:54    

j'ajoute juste le prototype de rb_define_method, ca peut toujours servir :
 

Code :
  1. void rb_define_method(VALUE, const char*, VALUE(*)(...), int);

Reply

Marsh Posté le 28-07-2002 à 18:50:36    

Donc il faut que t'écrives:

Code :
  1. static VALUE simple_run(...)
  2. {
  3. return Qtrue;
  4. }

Reply

Marsh Posté le 28-07-2002 à 18:53:44    

Le probleme, c'est que dans ce test je me sers pas des parametres donc ca me gène pas. Mais si je veux les recupérer je suis obligé de me taper tout le traitement avec les va_list & cie ?  
 
Question annexe : comment ca se fait que ca marche en C ?
 
Edit:
Apres test, le ... permet de compiler sans probleme, mais du coup la bibliothèque est inutilisable :  
 
irb(main):001:0> require 'simple'
LoadError: (null) - ./simpe.so


Message édité par lorill le 28-07-2002 à 19:46:42
Reply

Marsh Posté le 28-07-2002 à 23:17:01    

Je me reponds :
 
Pour le LoadError dans ruby, c'est parce que le symbole attribué a la fonction ne colle pas avec ce qu'il aurait été en C, donc l'interpréteur ne peut pas l'appeler. Il faut préciser extern "C".  
 
Pour le probleme des ellipses, un bon gros cast des familles fait l'affaire.
 
Voila ce que ca donne au final
 

Code :
  1. #include "ruby.h"
  2. #define RB_METHOD(func) ((VALUE (*)(...))func)
  3. static VALUE simple_run(VALUE obj)
  4. {
  5. return Qtrue;
  6. }
  7. extern "C" void Init_simple(void)
  8. {
  9.    VALUE klass = rb_define_class("Simple", rb_cObject);
  10.    rb_define_method(klass, "run", RB_METHOD(simple_run), 0);
  11. }


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed