2008-11-19 5 views
0

Un suivi à une question précédente, montrant la partie qui échoue lorsque je tente de faire passer le message d'erreur de ma bibliothèque cible:Comment renvoyez-vous une variable dans une interface C -> ruby?

require 'gt4r' 

@@test_environment = "INCLUDE=C:\\graphtalk\\env\\aiadev\\config\\aiadev.ini" 
@@normal_user = "BMCHARGUE" 

describe Gt4r do 
    it 'initializes' do 
     rv = Gt4r.gTD_initialize @@normal_user, @@normal_user, @@test_environment 
     Gt4r.gTD_get_error_message rv, @msg 
     @msg.should == "" 
     rv.should == 0 
    end 
end 

Je pense que le message d'erreur à retourner dans @msg, mais lors de son exécution Je reçois le texte suivant:

Gt4r 
(eval):5: [BUG] Segmentation fault 
ruby 1.8.6 (2008-08-11) [i386-mswin32] 


This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

Et ce si j'utilise un symbole (: msg) à la place:

C:\code\GraphTalk\gt4r_dl>spec -fs -rgt4r gt4r_spec.rb 

Gt4r 
- initializes (ERROR - 1) 

1) 
NoMethodError in 'Gt4r initializes' 
undefined method `to_ptr' for :msg:Symbol 
(eval):5:in `call' 
(eval):5:in `gTD_get_error_message' 
./gt4r_spec.rb:9: 

Finished in 0.046 seconds 

1 example, 1 failure 

Il est clair que je manque quelque chose Passin g paramètres entre ruby ​​et C. Quel genre de variable ruby ​​ai-je besoin pour récupérer ma valeur?

Répondre

2

Quel bit est en échec? Je suppose que c'est ceci:

Gt4r.gTD_get_error_message rv, @msg 

Comment la méthode est-elle implémentée? Quelle est la signature C de la méthode? (*carboniser)? Btw: au risque de ressembler à un disque rayé, il est BEAUCOUP plus facile d'écrire une extension C que d'essayer de faire passer les choses dans DL. AFAIK, personne n'utilise DL, à part peut-être des hacks uniques pour cartographier des fonctions uniques. Vous avez mentionné que FFI ne fonctionne pas sous Windows, vous pouvez jeter un oeil à RubyInline (http://www.zenspider.com/ZSS/Products/RubyInline/), ou simplement utiliser une extension C simple (si vous connaissez assez bien C pour utiliser DL, vous connaissez assez bien C pour écrire une extension)

-1

[email protected] même initialisés à ce stade:

Gt4r.gTD_get_error_message rv, @msg 

Si @msg est nul, DL sera probablement jeté à un pointeur nULL qui se bloque lorsque votre lib tente de déréférencer.

Questions connexes