From tlumley at uw.edu  Thu Aug 11 23:50:39 2011
From: tlumley at uw.edu (Thomas Lumley)
Date: Fri, 12 Aug 2011 09:50:39 +1200
Subject: [Rd] .C and .Call: convolve example not working
In-Reply-To: <CADJn3hfrTG9dOMi3QKqZ0FmgOTtU96D+QsxU1c1xK1CA-3PMrQ@mail.gmail.com>
References: <CADJn3hfrTG9dOMi3QKqZ0FmgOTtU96D+QsxU1c1xK1CA-3PMrQ@mail.gmail.com>
Message-ID: <CAJ55+d+vxv6nskRwqo1xp30EkPx4sVCYvAMGZpULqJUx7QpAjA@mail.gmail.com>

On Fri, Aug 12, 2011 at 1:06 AM, Lars Wi?ler <jahftw at googlemail.com> wrote:
> Dear R users,
>
> I want to call C code via the .C or .Call interface. This works fine
> with integer values but using doubles the array received in C will be
> set to zeros.
>
> I have tried the convolve examples (Writing R extensions, chapter 5.2)
> and still the resulting array consists of zeros.
>
> My code (shortened for my purposes. Original did not work either):
> ------------------------------------------------------------
> convolve.r
>
> a=array(1, c(4))
> b=array(3, c(4))
>
> print(a)
> print(b)
>
> .C("convolve",
> ? ?as.double(a),
> ? ?as.double(b))
>
> ----------------------------------------------------------------
> convolve.c
>
> void convolve(double* a, double* b){
> ? ? int i;
>
> ? ? for(i=0;i<4;i++) Rprintf("a: %d", a[i]);
> ? ? for(i=0;i<4;i++) Rprintf("b: %d", b[i]);
> }


The C code here is wrong for two reasons.  Firstly, there's no
declaration for Rprintf(), because you don't include the header file.

Secondly, you're using %d to print, which means you are telling the
compiler you're passing ints to Rprintf(), but you are actually
passing doubles.

When I fix these problems the code works for me.

    -thomas

Thomas Lumley
Professor of Biostatistics
University of Auckland



[Rd] .C and .Call: convolve example not working
Thomas Lumley