Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1746 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°184734
lorill
Posté le 28-07-2002 à 18:26:31  profilanswer
 

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
mood
Publicité
Posté le 28-07-2002 à 18:26:31  profilanswer
 

n°184737
lorill
Posté le 28-07-2002 à 18:45:54  profilanswer
 

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

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

n°184739
verdoux
And I'm still waiting
Posté le 28-07-2002 à 18:50:36  profilanswer
 

Donc il faut que t'écrives:

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

n°184743
lorill
Posté le 28-07-2002 à 18:53:44  profilanswer
 

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
n°184823
lorill
Posté le 28-07-2002 à 23:17:01  profilanswer
 

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. }



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[PHP] Recup du nom de la page appelant le script...... [RESOLU][SGBD résolu] Concaténation de 2 champs numériques dans une requête
MCI_MAKE_TMSF en VB [Résolu par moi même][JS] formulaire : une image qui efface le contenu ??? [RESOLU]
Script pour fond immobile [résolu]Problème hydraphp et mysql en local (avec easyPHP) (résolu)
[php] trouver la premier place ou inserer un enregistrement (résolu)[VBA] Urgent - Comment modifier le menu contextuel de Word? [résolu]
[Java] Structure de graphes [RESOLU] 
Plus de sujets relatifs à : [RESOLU] - [C++][ruby] extensions ou elipses


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)