Ruby on Rails
Tuesday, November 24, 2015
Follow example in fiddle document about "strcpy" and finally got it right.
Liz
On Monday, November 23, 2015 at 2:22:24 PM UTC-5, Liz Huang wrote:
I tried like this:
msg = " "
buf = Fiddle::Pointer[msg]
libm = Fiddle.dlopen('/var/www/myapp/smart/lib/lib_add.so')
add = Fiddle::Function.new(libm['add'],[Fiddle::TYPE_LONG,
Fiddle::TYPE_DOUBLE,
Fiddle::TYPE_DOUBLE,
Fiddle::TYPE_VOIDP],
Fiddle::TYPE_LONG)
session[:n]=add.call(session[:nmax], session[:delta], session[:conf], buf)
session[:errmsg] = buf.to_str
session[:n] is correct, I see that I could get the underlying pointer for ruby objectand return it as a Fiddle::Pointer object, and I can pass the pointer to C function,
don't know how to get session[:errmsg] from buf returned...
Liz
On Monday, November 23, 2015 at 2:07:41 PM UTC-5, Liz Huang wrote:
I have trouble even getting adding value n returned when I tried to use
Fiddle::Function.new, I returned to my old way of using Fiddle:
class SamplesizeController < ApplicationController
require 'fiddle'
require 'fiddle/import'
module Libm
extend Fiddle::Importer
dlload '/var/www/myapp/smart/lib/lib_add.so'
extern 'long add(long, double, double, char *)'
end
def compute
session[:n] = Libm.add( session[:nmax], session[:delta],
session[:conf], session[:errmsg] )
end
...
end
This way, my session[:n] is returned correctly, even I couldn't
get session[:errmsg].
Before, I was able to pass session[:errmsg] and get out
errormsg (don't need to deal with Fiddle::Pointer), my
c code, I didn't use malloc for errmsg, but copy another
char * to errmsg using a for loop...
Liz
On Monday, November 23, 2015 at 1:02:36 PM UTC-5, Liz Huang wrote:
If I don't allocate a new buffer, then I don't need pointer to a pointer? For example, I
just copy an existing char * iarr to errMsg?
long add(long maxn, double delta, double conf, char *errMsg)
{
long answer;
int i;
char *iarr;
//errMsg = (char *) malloc(6*sizeof(char));
answer = (long)(maxn + delta + conf);
iarr = "Hello!";
for(i=0;i<6;i++) errMsg[i] = (char) iarr[i];
return answer;
}
The document for Fiddle is so limited, wonder where I could find an example doing
what you said? Now I can just guess and try, guess I use
buf = Fiddle::Pointer.malloc(8)
then pass buf to C function,
then try to convert string from buf returned?
Liz
On Monday, November 23, 2015 at 12:21:27 PM UTC-5, Frederick Cheung wrote:On Monday, November 23, 2015 at 3:25:07 PM UTC, Liz Huang wrote:
Thanks!
Strange that I am able to get error message before just using char *, thought
it meant passing string by pointer already.it does, but if you want to allocate a new buffer and have the caller access that then you need pointer to a pointerI change the argument to char ** errMsg, but in Ruby, when I tried to
convert the pointer to string, I got error message:
[snip]Do I need to change anything in ruby file when use a pointer?
if options.is_a?(::JSON::State)# Called from JSON.{generate,dump}, forward it to JSON gem's to_jsonself.to_json_without_active_support_encoder(options) else# to_json is being invoked directly, use ActiveSupport's encoderActiveSupport::JSON.encode(self, options) Yes. You need to allocate a pointer size bit of memory for the C function (via Fiddle::Pointer). The C function fills that in, you then use the ptr method on Fiddle::Pointer to get the memory allocated by the C function, and create your string from there. (don't forget to free the memory too)Fred
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/821674bc-d086-494f-b513-62a1d050c052%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment