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/e5a6ed48-0dc8-4647-9e9a-d56ee74d7798%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.