On Friday, November 20, 2015 at 5:34:33 PM UTC, Liz Huang wrote:
> Hi,
> 
> I am trying to use Fiddle to call C function in dynamic library, I used to be 
> able to
> pass a return long variable and an error message, but now only return long 
> variable
> is returned, can't get the error message, I create a very simple example to 
> test,
> this is my add.c 
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> long add(long maxn, double delta, double conf, char *errMsg)
> {
>         long answer;
> 
>         errMsg = (char *) malloc(6*sizeof(char));
>         answer = (long)(maxn + delta + conf);
>         errMsg = "Hello!";


Arguments are passed by value in C, so if you assign to a variable in a 
function it does not change its value in the calling function. You need to 
change your C function so that either:

- the argument is a pointer to some memory allocated by the caller and you copy 
into it by strncpy or similar
- the argument is a pointer to a pointer size block of memory. Your function 
would then allocate a buffer, write the error message to that buffer and then 
write the value of the pointer to the argument, ie the last argument to the 
function is now char **message and your code does *message = malloc(...)

Fred


> 
>         return answer;
> }
> 
> and add.h
> 
> #ifndef add_h
> #define add_h
> 
> long add(long maxn, double delta, double conf, char *errMsg);
> 
> #endif
> 
> I created lib_add.so  and  part of my .rb file calling fiddle:
> 
> class SamplesizeController < ApplicationController
>   require 'fiddle'
> 
> .....
>   def compute
> 
>          str = "there!"
>          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)
> 
>         add.call(session[:nmax], session[:delta], session[:conf], str)
>         session[:errmsg] = str.to_s
>         redirect_to :action => "results"
>     end
> 
> ....
> 
> end
> 
>  session[:errmsg] can be modified? only return variable can be changed or 
> something I did
> was wrong? Any advice will be greatly appreciated.
> 
> Thanks!
> Liz

-- 
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/d174cdab-834f-4c82-9693-4c7092355c9c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to