Ruby on Rails Monday, November 23, 2015



Thanks!

Strange that I am able to get error message before just using char *, thought
it meant passing string by pointer already.

I change the argument to char ** errMsg, but in Ruby, when I tried to
convert the pointer to string, I got error message:

Encoding::UndefinedConversionError in SamplesizeController#compute

"\xC9" from ASCII-8BIT to UTF-8

Extracted source (around line #34):
32  33  34  35  36  37                
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?

Thanks!
Liz

On Friday, November 20, 2015 at 2:57:33 PM UTC-5, Frederick Cheung wrote:
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);
>
>

No comments:

Post a Comment