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 object
> and return it as a Fiddle::Pointer
> <http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle/Pointer.html>
> 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 pointer
>>>>
>>>>
>>>>> I change the argument to char ** errMsg, but in Ruby, when I tried to
>>>>> convert the pointer to string, I got error message:
>>>>>
>>>>>
>>>>> [snip]
>>>>
>>>>
>>>>> if options.is_a?(::JSON::State)
>>>>> # Called from JSON.{generate,dump}, forward it to JSON gem's
>>>>> to_json
>>>>> self.to_json_without_active_support_encoder(options)
>>>>> else
>>>>> # to_json is being invoked directly, use ActiveSupport's encoder
>>>>> ActiveSupport::JSON.encode(self, options)
>>>>>
>>>>> Do I need to change anything in ruby file when use a pointer?
>>>>>
>>>>>
>>>> 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 [email protected].
To post to this group, send email to [email protected].
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.